我堆积了两个查询,因为我需要一个结果表。 我用cte表和一些函数进行了一个复杂的第一次查询,这给了我这样的一行结果:
SELECT TOP 1 Result1, Result2, Result3
FROM someTable
INNER JOIN antoherTable ...
WHERE ...
ORDER BY...
结果表:
Result1,Result2,Result3
1,2,3
在同一过程中,我有第二条SELECT语句,如下所示:
SELECT Col1, Col2, Col3, Result
FROM tbl1
INNER JOIN tbl2 ..
WHERE ...
ORDER BY..
Result table:
Col1, Col2, Col3, Result
aa,bb,cc,5
aa,bb,cc,0
aa,bb,cc,2
aa,bb,cc,1
以某种方式,我需要标记结果来自第一个查询的行(在此示例中为后两行)。
我使用SQL Server2005。我尝试添加带有0/1值的称为“标记”的额外列,并将整个第一个查询放入CASE WHEN函数中。
它看起来像这样:
SELECT Col1, Col2, Col3, Result,
CASE WHEN Result IN (SELECT TOP 1 Result1, Result2, Result3 ....)
FROM tbl1
INNER JOIN tbl2 ..
WHERE ...
ORDER BY..
但是它给了我一个错误: 如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式
仅当我使用一列时,它才有效,像这样只有Result1:
CASE WHEN Result IN (SELECT TOP 1 Result1 ....)
我找到了带有该错误消息的线程,并且还尝试了EXISTS函数,但没有成功。
在此先感谢您,并对业余问题深表歉意。
答案 0 :(得分:2)
您可以改用exists
:
(CASE WHEN EXISTS (SELECT 1
FROM . . . -- your query here
WHERE x.Result IN (y.Result1, y.Result2, y.Result3)
)
. . .
请注意,x
是 outer 查询的别名,而y
是内部查询的别名。
您还可以使用IN
并取消透视:
(CASE WHEN x.result IN (SELECT v.Result
FROM . . . CROSS APPLY
(VALUES (Result1), (Result2), (Result3)) v(result
)
. . .