SQL Server比较两个表

时间:2015-06-11 14:49:43

标签: sql-server

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

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

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

TABLE B ('B')
       ,('C')

然后,让变量@In = 1

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

我该怎么做?

4 个答案:

答案 0 :(得分:1)

试试这个:

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

有关EXCEPT和INTERSECT的文档,请参阅此处:https://msdn.microsoft.com/en-GB/library/ms188055.aspx

假设您正在使用SQL Server 2005+!

编辑:修正了0/1分配的反向逻辑(哎呀!)。 有关工作示例,请参阅SQL小提琴:http://sqlfiddle.com/#!3/b9769/4

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

答案 1 :(得分: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

答案 2 :(得分:0)

这是基于尼尔的建议(它有效):

create table A (col varchar(10))
create table B (col varchar(10))
declare @InT Int, @InB Int, @In Int

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

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

select @InT =  count(*) from A join B on A.col = B.col
select @InB =  count(*) from B

IF (@InT = @InB)
  SET @In = 1
Else
  SET @In = 0

print '@In = ' + CAST(@In As VARCHAR(10))
print '@InT = ' + CAST(@InT As VARCHAR(10))
print '@InB = ' + CAST(@InB As VARCHAR(10))

DROP TABLE A
DROP TABLE B

答案 3 :(得分:0)

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

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