SQL Server 2012如何确定表A中的所有值是否都在表B中

时间:2019-06-19 13:36:45

标签: sql sql-server

我有两个共享相同值(颜色)的表(A和B),两个表可以有任意数量的行。我试图找到一种方法来确定表A中所有不同的“颜色”是否都存在于表B中:

我尝试使用EXCEPT几乎可以正常工作,但是不幸的是,当表B的颜色比表A多时,它返回false,这与我关心的无关,如果表A中每个与表A不同的颜色都在表B中。摆弄EXISTS和IN,但看不到正确的结果

declare @TableA table (Color varchar(10))
declare @TableB table (Color varchar(10))

insert into @TableA(Color) values ('red')
insert into @TableA(Color) values ('blue')
insert into @TableA(Color) values ('green')
--insert into @TableA(Color) values ('orange')


insert into @TableB(Color) values ('red')
insert into @TableB(Color) values ('blue')
insert into @TableB(Color) values ('green')
insert into @TableB(Color) values ('yellow')
insert into @TableB(Color) values ('purple')

IF NOT EXISTS (
    SELECT Color FROM @TableA
    EXCEPT
    SELECT Color FROM @TableB
)
SELECT 'true'
ELSE SELECT 'false'

我希望上面的代码产生'true'。

IF table A Colors > table B Colors THEN false
IF table A Colors <= table B Colors THEN true.

3 个答案:

答案 0 :(得分:2)

有很多方法可以完成此任务。您可以很容易地使用左联接。

if exists
(
    SELECT a.Color 
    FROM @TableA a
    left join @TableB b on b.Color = a.Color
    where b.Color is null
) 
    select 'Some Colors in A are not in B'
else
    select 'ALL Colors in A exist in B'

答案 1 :(得分:0)

您还可以只使用现有查询并添加DISTINCT:

ReExecutablePromise { _then: [], _fn: [Function], _taskPromise: null }

答案 2 :(得分:-1)

另一种方法可以是比较TableAINNER JOIN之间TableA中不同元素的数量与TableB中不同元素的数量

这远不是一个优化的解决方案,但它可以工作。

SELECT
CASE WHEN (SELECT COUNT(*)
    FROM
    (
        SELECT a.Color
        FROM @TableA a
        INNER JOIN @TableB b
        ON a.Color = b.Color
        GROUP BY a.Color
    ) T1) = (SELECT COUNT(*)
    FROM
    (
        SELECT a.Color
        FROM @TableA a
        GROUP BY a.Color
    ) T2)
    THEN 'true'
    ELSE 'false'
END