我有两个表,每个表有一列:
如果表B中的所有行都包含在表A中,例如
TABLE A ('A')
,('B')
,('C')
,('D')
TABLE B ('B')
,('C')
然后,让变量@In = 1
否则,如果表B包含不在A中的行,则让@In = 0
我该怎么做?
答案 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