我会问我的数据库:第二个子查询是否包含第一个子查询的结果。
示例:
select
case
when (select [sub1_column] from [sub1]) IN (select [sub2_column] from [sub2]) then 'true'
else 'false'
end;
此代码失败:
子查询返回的值超过1。
如何比较这些子查询?
编辑:
我的表格如下:
[sub1_column]|
-------------+
| 'd' |
| 'c' |
| 'b' |
-------------+
[sub2_column]|
-------------+
| 'a' |
| 'b' |
| 'c' |
| 'd' |
| 'e' |
-------------+
结果为TRUE sub_1列值在sub2_column
中 CASE
声明只是一个例子。如果我想在WHERE
语句中比较这些子查询,该怎么办?
答案 0 :(得分:1)
试试这个:
使用EXCEPT
。如果没有找到记录,则两者都有相同的记录。如果找到记录,则记录不匹配。
SELECT
CASE
WHEN
NOT EXISTS
(
SELECT
[sub1_column]
FROM
[sub1]
EXCEPT
SELECT
[sub2_column]
FROM
[sub2]
)
THEN 'true'
ELSE 'false'
END;
答案 1 :(得分:0)
使用EXISTS
:
SELECT CASE WHEN EXISTS
(
SELECT 1 FROM dbo.sub1 WHERE sub1_column IN(select sub2_column from sub2)
)
THEN 'true'
ELSE 'false' END AS Sub1ColumnExistsInSub2Column
Demo 与您的样本。
答案 2 :(得分:0)
您可以使用intersect获取两个查询中都存在的记录:
select
case
when exists(
select [sub1_column] from [sub1]
intersect
select [sub2_column] from [sub2]
)
then 'true'
else 'false'
end;
答案 3 :(得分:0)
尝试这种方式:
select sub1_column,
CASE WHEN sub2_column IS NULL THEN 'False' ELSE 'True' END AS sub2_column
from sub1 LEFT JOIN
sub2 on sub1.sub1_column=sub2.sub2_column
答案 4 :(得分:0)
如何使用加入?
select ...
from (select [sub1_column] from [sub1]) as a
join (select [sub2_column] from [sub2]) as b on a.[sub1_column] = b.[sub2_column]
答案 5 :(得分:0)
您需要连接两个表,并确保第二组中没有不在第一组中的行。
SELECT COUNT(1) FROM sub1
RIGHT OUTER JOIN sub2 ON sub1.sub1_column=sub2.sub2_column
WHERE sub2.sub2_column IS NULL
如果所有sub1列值都包含在sub2中,则这将有效地返回> 0,否则返回0。 如果需要(WHEN 0 ELSE ...)
,您可以轻松地将其扩展为EXISTS()或CASE