将子查询设置为要在IN运算符中使用的变量

时间:2016-11-08 14:21:28

标签: sql sql-server-2014

我想使用一个变量来表示将在查询的WHERE子句中使用的结果集。

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.

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 ) 
        )

答案 2 :(得分:1)

让我们从错误消息开始

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,&lt;,&lt; =,&gt;,&gt; =或当子查询用作   表达。

原因很简单,您将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)存在

请在Rich Benner的答案中找到样本。我在打字时发布了它。但我在那里发现了一个拼写错误,他在存在块中使用了不同的别名

 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