我想使用一个变量来表示将在查询的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.
答案 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