2016-11-08 61 views
1

我想使用變量來表示將在查詢的WHERE子句中使用的結果集。將子查詢設置爲要在IN運算符內使用的變量

SELECT * 
FROM Table1 
WHERE 
    Exam1_ID IN (SELECT Id FROM Exam) 
    OR Exam2_ID IN (SELECT Id FROM Exam) 
    OR Exam3_ID IN (SELECT Id FROM Exam) 
    OR Exam4_ID IN (SELECT Id FROM Exam) 

我想用一個變量代替SELECT Id FROM Exam,所以我不必重複查詢。我試過聲明一個變量,但由於子查詢的結果可能包含多個整數,所以我不確定將變量聲明爲什麼。我繼續嘗試...

DECLARE @SubQuery INT; 
SET @SubQuery = (SELECT Id FROM Exam); 

SELECT * 
FROM Table1 
WHERE 
    Exam1_ID IN (@SubQuery) 
    OR Exam2_ID IN (@SubQuery) 
    OR Exam3_ID IN (@SubQuery) 
    OR Exam4_ID IN (@SubQuery) 

我收到以下錯誤..

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

+0

您是否嘗試將該變量聲明爲表而不是單個值? –

+0

您將您的變量聲明爲INT,這就是它的* an *(單數)int,因此它不能保存多個值。要做你想做的事情,你可以將這些值連接成一個'varchar',並使用動態sql(儘管有更簡單的解決方案,就像Rich Benner的解決方案)。 – HoneyBadger

回答

2

你可以寫這樣的存在。

 SELECT * 
     FROM Table1 t1 
     WHERE EXISTS ( 
     SELECT 1 FROM Exam e 
     WHERE e.Id in (t1.Exam1_ID , t1.Exam2_ID , t1.Exam3_ID, t1.Exam4_ID) 
     ) 
3

你可能會發現,這個用WHERE EXISTS這樣

SELECT * 
FROM Table1 t1 
WHERE EXISTS ( SELECT * 
       FROM Exam e 
       WHERE t1.Exam1_ID = e.Id 
       OR t1.Exam2_ID = e.Id 
       OR t1.Exam3_ID = e.Id 
       OR t1.Exam4_ID = e.Id) 
性能更好
+2

並使用'WHERE e.Id IN(Exam1_ID,Exam2_ID,...)'' – jarlh

1

允許從錯誤消息

子查詢返回多個值1開始。當 子查詢遵循=,!=,<,< =,>,> =或當子查詢用作 表達式時,這是不允許的。

原因很簡單,你宣佈你的subquery作爲INT 所以,如果你將其更改爲TABLE(Id INT)您將收到新的錯誤消息。

您可以使用不同的方式來解決您的問題。

1)內連接(它可以給你重複的,所以我不知道是不是適用於您使用此方法)

DECLARE @SubQuery TABLE (RecordId INT) 

INSERT INTO 
    @SubQuery 
SELECT 
    Id 
FROM 
    Exam 

SELECT * 
FROM 
    Table1 t1 
INNER JOIN @Subquery sq 
    ON sq.Id = t1.Exam1_ID 
    OR sq.Id = t1.Exam2_ID 
    OR sq.Id = t1.Exam3_ID 
    OR sq.Id = t1.Exam4_ID 

2)存在

請找到豐富的本納回答樣本。我在打字的時候發佈了它。但我在那裏發現了一個錯字,他在存在塊中使用了不同的別名

OR t1.Exam2_ID = e.Id --t1 - correct alias 
OR t2.Exam2_ID = e.Id --t2 - incorrect 
OR t3.Exam2_ID = e.Id --t3 - incorrect 
OR t4.Exam2_ID = e.Id --t4 - incorrect 
+0

更加美觀。感謝您指出錯字,修復。有一個upvote :) –