在另一查询中使用一行SELECT TOP 1中的值

时间:2019-05-20 14:10:30

标签: sql sql-server tsql

我堆积了两个查询,因为我需要一个结果表。 我用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函数,但没有成功。

在此先感谢您,并对业余问题深表歉意。

1 个答案:

答案 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
                       )
      . . .