SQL Server:检查其他表中是否存在所有行

时间:2012-04-27 15:46:07

标签: sql-server

我需要知道一个表中的所有行是否都存在于其他表中:

declare @Table1 table (id int)
declare @Table2 table (id int)

insert into @Table1(id) values (1)
insert into @Table1(id) values (4)
insert into @Table1(id) values (5)


insert into @Table2(id) values (1)
insert into @Table2(id) values (2)
insert into @Table2(id) values (3)

if exists (select id from @Table1 where id in (select id from @Table2))
    select 'yes exists'
else
    select 'no, doesn''t exist' 

此查询返回yes exists,但应返回no, doesn't exist,因为@Table2中仅存在1,而值4和5不存在。

我的查询应该更改什么?谢谢!

4 个答案:

答案 0 :(得分:9)

IF NOT EXISTS (
    SELECT ID FROM @Table1
    EXCEPT
    SELECT ID FROM @Table2
)
SELECT 'yes exists'
ELSE SELECT 'no, doesn''t exist'

答案 1 :(得分:2)

您可以使用EXCEPT来获取两个表的设置差异。如果返回任何ID,则两个表都不相等:

SELECT ID
FROM @Table1
EXCEPT 
SELECT ID
FROM @Table2

EXCEPT返回左侧查询中的任何不同值,这些值在右侧查询中也找不到。

所以,要让你的“不,不存在”

;WITH diff AS(
    SELECT ID
    FROM @Table1
    EXCEPT 
    SELECT ID
    FROM @Table2
)
SELECT CASE WHEN COUNT(diff.ID) = 0 
         THEN 'yes exists'
         ELSE 'no, doesnt exist'
         END AS Result
FROM diff

答案 2 :(得分:0)

select case when count(*) > 0 then 'no' else 'yes' end as AllExist
from @Table1 t1
left outer join @Table2 t2 on t1.id = t2.id
where t2.id is null

答案 3 :(得分:0)

只要两个id列都是唯一的(如果它们是id,它们就应该是这样),这将有效。

DECLARE @totalRows int;
SET @totalRows = SELECT count(*) from Table1;

RETURN (@totalRows == SELECT count(*) from Table1 JOIN Table2 on Table1.id = Table2.id)