Sql server SQL Server比较两个表

Sql server SQL Server比较两个表,sql-server,Sql Server,我有两个表,每个表有一列: 如果表B的所有行都包含在表A中,例如 TABLE A ('A') ,('B') ,('C') ,('D') TABLE B ('B') ,('C') 然后,让变量@In=1 否则,如果表B包含不在A中的行,则让@in=0 我该怎么做?这个怎么样: select case when count(*) > 0 then 0 else 1 from a full outer join b on a.a = b

我有两个表,每个表有一列:

如果表B的所有行都包含在表A中,例如

TABLE A ('A')
       ,('B')
       ,('C')
       ,('D')

TABLE B ('B')
       ,('C')
然后,让变量@In=1

否则,如果表B包含不在A中的行,则让@in=0

我该怎么做?

这个怎么样:

select case when count(*) > 0 then 0 else 1
from a full outer join b on a.a = b.b
where a.a = null or b.b= null
试试这个:

IF EXISTS (SELECT * FROM B 
           EXCEPT
           SELECT * FROM A)
    SET @In = 0
ELSE
    SET @In = 1
有关“除外”和“相交”的文档,请参见此处:

当然,假设您使用的是SQL Server 2005+

编辑:修复了0/1赋值的反向逻辑(哎呀!)。 有关工作示例,请参见此处的SQL Fiddle:


编辑2:在澄清后交换EXISTS子句中的表A和表B。

这是基于Neil的建议(有效):


这是基于Beercohol的查询。(如果我取消对表B的Z的注释,仍然会得到相同的@In

create table A (col varchar(10))
create table B (col varchar(10))
DECLARE @In INT

INSERT INTO A VALUES 
    ('A')
   ,('B')
   ,('C')
   ,('D')

INSERT INTO B VALUES  
    ('B')
   ,('C')
 --  ,('Z')


IF EXISTS (SELECT * FROM A 
       EXCEPT
       SELECT * FROM B)
   SET @In = 0
ELSE
   SET @In = 1

PRINT @In
DROP TABLE A
DROP TABLE B    

看看使用EXISTS和/或NOT EXISTS。它不起作用。我使用相同的想法首先将数据存储在临时表中,但它也不起作用。哇!感谢您发现我的错误@NeilP。我更新了答案并提供了SQL FIDLE。Beercohol,感谢您的帮助。当我在0和1之间切换时,查询也总是给我一个值0或1。您好@user1816353,您是说无论表是否不同,查询总是返回相同的值吗?我在这里创建了第二个SQL FIDLE,它显示了表是否相同的示例,并返回与第一个相反的值:两者之间的唯一区别是填充表的插入.beercohol,我在下面发布查询。您能帮我检查一下吗?再次感谢!谢谢Neil,但它没有给我正确的答案。应该可以,您可以更改case语句以显示行,以确定出错的位置。您的数据是否包含混合的大小写?您的数据库可能设置为区分大小写或重音,因此应该匹配的内容不匹配。请查看我的更新答案-我的1和0的取整方式错误,抱歉!是的,应该可以,但请注意,如果涉及多个列,它将无法轻松或很好地进行缩放!EXISTS with将适用于任意数量的列。是的,它将始终返回零,因为表不同,这是除了测试之外,还有什么?测试。我以为这就是你要问的!你的问题措辞不清楚。如果你想检查表B中没有不包含在A中的行(不管A中还有什么其他行),然后使用Neil的答案。好的,对不起,我考虑了更多,您只需将表a和表B替换为“除外”,即可获得所需的结果。我再次更新了我的答案,请尝试!使用更新的小提琴:
create table A (col varchar(10))
create table B (col varchar(10))
DECLARE @In INT

INSERT INTO A VALUES 
    ('A')
   ,('B')
   ,('C')
   ,('D')

INSERT INTO B VALUES  
    ('B')
   ,('C')
 --  ,('Z')


IF EXISTS (SELECT * FROM A 
       EXCEPT
       SELECT * FROM B)
   SET @In = 0
ELSE
   SET @In = 1

PRINT @In
DROP TABLE A
DROP TABLE B