SQL Server:比较两个表,两列

时间:2011-10-11 20:29:14

标签: 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

2 个答案:

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

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