2010-08-06 39 views
0

這裏就是我想要做一個SQL Server過程中:的SQL Server/2在同一個存儲過程選擇

@ID1 int 

select ID2 from TableA where ID1 = @ID1 

(for each selected @ID2) 
    select * from TableB where ID2 = @ID2 

任何想法?

+0

什麼是你的表結構和所需的輸出?你究竟在做什麼,在這裏? – AllenG 2010-08-06 18:18:43

+0

你是否想爲TableB中的每個選擇單獨設置一個結果集,或者你還可以返回一個包含所有這些行的結果集? – SqlRyan 2010-08-06 18:18:55

+0

我需要一個結果集。 – asmo 2010-08-06 18:25:27

回答

10

,可以在單個語句來完成:

SELECT b.* 
    FROM TABLE_B b 
    JOIN TABLE_A a ON a.id2 = b.id2 
WHERE a.id1 = @ID1 

但這意味着會有重複,如果在TABLE_A多個記錄涉及表-B記錄。在這種情況下,使用EXISTS,而不是添加DISTINCT於前一查詢:

SELECT b.* 
    FROM TABLE_B b 
WHERE EXISTS(SELECT NULL 
       FROM TABLE_A a 
       WHERE a.id2 = b.id2 
       AND a.id1 = @ID1) 

IN子句是等效的,但EXISTS會更快,如果有重複:

SELECT b.* 
    FROM TABLE_B b 
WHERE b.id2 IN (SELECT a.id2 
        FROM TABLE_A a 
        WHERE a.id1 = @ID1) 
+0

和A.ID1 = @ ID1 ... – Jonathan 2010-08-06 18:20:09

1

試試這個:

select * from TableB b where exists (select top 1 * from TableA a where a.ID2 = b.ID2) 
1
SELECT * 
FROM TableB 
WHERE ID2 IN (SELECT ID2 FROM TableA WHERE ID1 = @ID1) 

一般而言,你不想在SQL Server中進行任何類型的循環。嘗試使用「基於集合」的操作。

+0

如果您發佈代碼或XML,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010)以良好地格式化並語法突出顯示它! – 2010-08-06 18:21:06

+0

SQL的格式很爛,所以我不打擾它。如果它真的讓你煩惱,你可以自由編輯帖子。 – StingyJack 2010-08-06 18:28:30

-2

對於每個無法在sql中工作,您必須使用遊標。

declare @id int 
declare @id2 int 

declare mycursor cursor for 
    select id2 from tablea where [email protected] 

open mycursor 

fetch next from mycursor into @id2 

while @@fetch_status = 0 
begin 

    your code here 

    fetch next from mycursor into @id2 
end 
close mycursor 
deallocate mycursor 
+7

遊標是邪惡的! – Jonathan 2010-08-06 18:21:07

+0

如果您發佈的是代碼或XML,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010),以良好地格式化和語法突出顯示它! – 2010-08-06 18:22:46

+0

不,我總是使用它,我從來沒有問題,但是,如果他需要一個單獨的子句,他可以使用存在或連接子句,但遊標和forech做同樣的效果 – elchente23 2010-08-06 18:36:26