我有两个共享相同值(颜色)的表(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.
答案 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)
另一种方法可以是比较TableA
和INNER 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