SQL Server 2012:如何判断表A所有唯一Color值都存在于表B
解决思路:验证表A的所有唯一Color是否都在表B中
我来帮你理清楚这个问题——你的需求其实完全可以用你写的EXCEPT逻辑实现,大概率是之前你把EXCEPT的顺序或者判断逻辑搞反了才出问题。
你的测试代码其实是正确的!
先看你提供的这段代码:
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'
它的逻辑完全贴合你的需求:
SELECT Color FROM @TableA EXCEPT SELECT Color FROM @TableB会返回表A存在但表B不存在的唯一Color值NOT EXISTS(...)表示当这个结果集为空时(也就是A的所有Color都在B里),返回'true';只要有一个A的Color不在B里,就返回'false'
你之前说用EXCEPT时表B有更多值会返回false,应该是把EXCEPT的顺序写反了(比如写成@TableB EXCEPT @TableA),或者把NOT EXISTS的判断逻辑搞反了。
其他可选实现方式
如果你想用EXISTS或者IN,也可以试试这两种写法:
用双层EXISTS检查缺失
IF NOT EXISTS ( SELECT 1 FROM (SELECT DISTINCT Color FROM @TableA) A WHERE NOT EXISTS ( SELECT 1 FROM @TableB B WHERE B.Color = A.Color ) ) SELECT 'true' ELSE SELECT 'false'
先提取表A的唯一Color,再逐一检查是否存在某个Color只在A里不在B里;如果没有这样的记录,就说明A的所有Color都在B中。
用计数对比验证
IF ( SELECT COUNT(DISTINCT Color) FROM @TableA ) = ( SELECT COUNT(DISTINCT A.Color) FROM @TableA A JOIN @TableB B ON A.Color = B.Color ) SELECT 'true' ELSE SELECT 'false'
逻辑是:表A的唯一Color总数,等于A和B关联后能匹配到的A的唯一Color数,就说明所有A的Color都在B里。
验证场景测试
- 当你注释掉
--insert into @TableA(Color) values ('orange')时,运行代码会返回'true' - 取消注释这条语句(此时A多了
orange而B没有),代码会返回'false'
完全符合你“只关注A的Color是否全在B里,不管B有没有额外值”的需求。
内容的提问来源于stack exchange,提问作者Jeff Martinez
相关产品推荐
相关产品推荐

