比较两个子查询

时间:2015-06-18 10:59:59

标签: sql-server case

我会问我的数据库:第二个子查询是否包含第一个子查询的结果。

示例:

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语句中比较这些子查询,该怎么办?

6 个答案:

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