SQL:根据其他表更新列

时间:2011-09-12 22:30:36

标签: sql sql-update

表A

ID MatchID1 MatchID2
1   1002    120
3   1003    141
5   1006    150
6   1008    140

表B

ID MatchID1 MatchID2 Status
1   1002     120 
2   1002     120
3   1002     120
4   1003     200
5   1006     150
6   1008     150
7   1008     140

如果符合以下情况,我想用'FAIL'填充TableB col = status 来自tableB的其MatchID1的所有matchID2不等于tableA中其对应的MAatchID1的matchID2 在这种情况下,tableB:120对应于1002,对于tableA也是如此,因此不会失败。 预期结果:

ID MatchID1 MatchID2 Status
    1   1002     120   NULL
    2   1002     120   NULL
    3   1002     120   NULL
    4   1003     200   FAIL
    5   1006     150   NULL
    6   1008     150   FAIL
    7   1008     140   FAIL

注意: 如果即使一个记录(match02)不匹配,也会失败match01的整个集合。比如表B中的id 6和7。提前谢谢。

4 个答案:

答案 0 :(得分:1)

UPDATE a
SET Status = 'FAIL'
FROM TableA a
  INNER JOIN (
    SELECT a.MatchID1
    FROM TableA a
      INNER JOIN b ON a.MatchID1 = b.MatchID1 AND a.MatchID2 <> b.MatchID2
    GROUP BY a.MatchID1
  ) x ON a.MatchID1 = x.MatchID1

答案 1 :(得分:1)

   update B
    set status = 'FAIL'
    From tableB B
    INNER JOIN (SELECT B.matchID1 FROM TableB B
                GROUP BY B.matchID1
                HAVING MAX(matchID1)<> MIN(MatchID2)) B1
    ON B.matchid1 = B1.MatchID1

UPDATE B
SET Status = 'FAIL'
FROM TableB B
  INNER JOIN TableA A
  ON A.MatchID1 = B.matchID1
WHERE A.matchID2 <> B.matchID2

答案 2 :(得分:0)

我认为您正在通过加入寻找更新。试试这个;

UPDATE TableB 
SET TableB.Status = CASE WHEN TableA.ID IS NULL THEN 'FAIL' ELSE NULL END
FROM TableB
LEFT JOIN TableA
ON TableB.MatchID1 = TableA.MatchID1
    AND TableB.MatchID2 = TableA.MatchID2 

您没有说明您使用的是哪种RDBMS,以上是针对SQL Server的。

答案 3 :(得分:0)

重读......还是不知道你问的是什么......

建议将你的努力分解成更小的块。

似乎你需要几件事:

  1. 一个小查询,只获取第一个表中有或没有不同匹配号的行。写下来。

  2. 一个小查询,用于查找第一个表中是否找到第二个表中的匹配号。写下来。

  3. 根据前两个查询设置值的更新。

  4. HTH

相关问题