2011-10-11 161 views
0

我有两个表。SQL Server:比较两个表,两列

  • TableAID int, Match1 char, Match2 char, status char
  • TableBMatch1 char, match2

我希望标记行中tableA在状态,其中对于同一match1, match2不存在tableB失败。

实施例:

表A

ID Match1 Match2 Status 
1 100 AB  
2 100 AR 
3 200 BC 
4 200 VB 
5 200 AB 

表B

Match1 Match2 
100  AF 
100  AR 
100  BG 
200  AB 
200  BJ 
200  VB 

预期结果:

表A

ID Match1 Match2 Status 
1 100 AB FAIL 
2 100 AR NULL 
3 200 BC FAIL 
4 200 VB NULL 
5 200 AB NULL 

感谢

我使用(不工作):

Update A 
set status = 'FAIL' 
from TableA A 
    Inner join TableB B 
    ON A.match1 = B.match1 
    WHERE A.match2 <> B.Match2 
+0

它为什么不起作用?你收到错误信息了吗?如果不是,你是否得到意想不到的输出?如果这样,那是什么? – 2011-10-11 20:31:21

+0

表A失败表A –

+0

中的所有记录marc_s:这是一个完全不同的问题! –

回答

2
UPDATE a 
    SET status = 'FAIL' 
    FROM TableA a 
    WHERE NOT EXISTS(SELECT NULL 
         FROM TableB b 
         WHERE a.match1 = b.match1 
          AND a.match2 = b.match2) 
+0

什么是“a”?请解释 – John

+0

是否正确,但它说#1064 - 你的SQL语法有错误; “FROM TableA WHERE NOT EXISTS(SELECT NULL FROM T'at line 3 – John

+0

@John 1)”a“是TableA的别名,2)检查与您的MySQL服务器版本对应的手册答案专门用于SQL Server。 MySQL不支持这种形式的更新和3)我希望你没有downvote这个答案,因为你试图取消它的背景。 –

0

试试这个:

DECLARE @TableA TABLE (ID INT, Match1 VARCHAR(10), Match2 VARCHAR(10), MatchStatus VARCHAR(10)) 

INSERT INTO @TableA(ID, Match1, Match2) 
VALUES(1, '100', 'AB'), (2, '100', 'AR'), (3, '200', 'BC'), (4, '200', 'VB'), (5, '200', 'AB') 

DECLARE @TableB TABLE (Match1 VARCHAR(10), Match2 VARCHAR(10)) 

INSERT INTO @TableB VALUES('100', 'AF'), ('100', 'AR'), ('100', 'BG'), ('200', 'AB'), 
('200', 'BJ'), ('200', 'VB') 

UPDATE @TableA 
SET MatchStatus = 'FAIL' 
WHERE NOT EXISTS 
      (SELECT * FROM @TableB b 
      WHERE b.Match1 = [@TableA].Match1 AND b.Match2 = [@TableA].Match2) 

SELECT * FROM @TableA 

给我的输出:

ID Match1 Match2 MatchStatus 
1 100  AB  FAIL 
2 100  AR  NULL 
3 200  BC  FAIL 
4 200  VB  NULL 
5 200  AB  NULL