2013-04-03 38 views
7

Có cách nào để chạy câu lệnh chọn từ "sau đó" trong trường hợp máy chủ sql/khi câu lệnh? (Tôi cần chạy các truy vấn phụ từ một câu lệnh sau đó.) Tôi không thể có nó trong câu lệnh where.chọn truy vấn con bên trong trường hợp khi có câu lệnh?

select 
    case @Group 
    when 6500 then (select top 10 * from Table1) 
    when 5450 then (select top 5 * from Table1) 
    when 2010 then (select top 3 * from Table1) 
    when 2000 then (select top 1 * from Table1) 
    else 0 
    end as 'Report' 
+0

Bạn muốn trả về 10 hàng hoặc 5 hàng hoặc 3 hàng, v.v. bên trong một giá trị cột đơn? Không chắc tôi làm theo. –

+0

Đó chỉ là những ví dụ về những gì tôi cần làm .... các truy vấn thực sự lâu hơn và không phải là hàng đầu. – Rainhider

Trả lời

2

Một lựa chọn là để loại bỏ điều này từ các truy vấn và làm điều gì đó như:

declare @Numrows int; 
select @Numrows = (case @Group 
         when 6500 then 10 
         when 5450 then 5 
         when 2010 then 3 
         when 2000 then 1 
         else 0 
        end); 

select top(@NumRows) * 
from Table1; 

Bạn cũng có thể làm theo cách này:

with const as (
     select (case @Group 
         when 6500 then 10 
         when 5450 then 5 
         when 2010 then 3 
         when 2000 then 1 
         else 0 
        end) as Numrows 
    ) 
select t.* 
from (select t.*, ROW_NUMBER() over() as seqnum 
     from table1 t 
    ) t cross join 
    const 
where seqnum <= NumRows; 

Trong trường hợp này, bạn cần phải liệt kê các cột để tránh bị seqnum trong danh sách.

Nhân tiện, thông thường khi sử dụng top bạn cũng phải có order by. Nếu không, kết quả sẽ không xác định.

+0

tốt, các truy vấn con chỉ là ví dụ về việc phải chạy truy vấn bên trong câu lệnh "sau đó". Các truy vấn thực tế mà tôi sẽ chạy có các cột và tổng và toàn bộ các thứ khác. – Rainhider

+1

@PerryDay. . . Vâng, bạn không thể làm điều đó với một câu lệnh SQL đơn. –

+0

ok. đó là những gì tôi đang tìm kiếm. cảm ơn! – Rainhider

2

Bạn không thể có SELECT trong vòng SELECT. Bạn có thể sử dụng IF ... ELSE mặc dù ví dụ:

IF @Group = 6500 
    select top 10* from Table1 AS Report 
ELSE IF @Group = 5450 
    select top 5* from Table1 AS Report 
ELSE IF @Group = 2010 
    select top 3* from Table1 AS Report 
ELSE IF @Group = 2000 
    select top 1* from Table1 AS Report 
1

@Gordon đã có câu trả lời rồi. Đây chỉ là lần thứ hai opnion. Bạn có thể sử dụng truy vấn động.


declare @query varchar(max) 
declare @Group int 
set @query = '' 

if @Group = 6500 
    set @query = 'select top 10 * from table1' 
if @Group = 5450 
    set @query = 'select top 5 * from table1' 
if @Group = 2010 
    set @query = 'select top 3 * from table1' 
if @Group = 2000 
    set @query = 'select top 1 * from table1' 

exec(@query) 
+0

biên dịch này không có lỗi, nhưng nó không hiển thị kết quả của truy vấn. Tôi cần nó để hiển thị kết quả. – Rainhider

+0

Bạn cần cung cấp giá trị biến Nhóm, như Set @Group = 6500, nếu không, truy vấn sẽ trống. – ljh

Các vấn đề liên quan