检查一个表中的数据是否包含在另一个表中

时间:2013-12-10 01:16:50

标签: sql subquery subset

declare @q table (A int);
declare @a table (B int);

insert into @q select 1 union select 2 union select 3;
insert into @a select 0 union select 1 union select 2 union select 3 union select 4;

我想知道@ q列A的数据是否是@a列B的子集。

这会产生错误。

if (select A from @q) in (select B from @a)
print 'yes' else print 'no';

这有效,但它是找出的最好方法吗?

if (select count(*) from @q) = (select count(*) from @q inner join @a on A = B)
print 'yes' else print 'no';

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

尝试使用EXCEPT。

SELECT ColumnA
FROM TableA
EXCEPT
SELECT ColumnB
FROM TableB

它将为您提供A中不属于B的所有内容的列表。

您可以将上面的结果插入表变量中,然后检查其COUNT(0 =子集,其他任何不是子集)。

答案 1 :(得分:0)

试试以下内容。这基本上可以查找@q中的任何内容,但不会查找@a中的任何内容。如果计数大于0,则返回否,否则是。

SELECT CASE 
      WHEN COUNT(*) > 0 THEN 'No'
      ELSE 'Yes'
   END 
FROM @q q
LEFT JOIN @a a
ON q.A = a.B 
WHERE a.B iS NULL

希望它有所帮助。