SQL:基于其他表更新列

SQL:基于其他表更新列,sql,sql-update,Sql,Sql Update,表 表B ID MatchID1 MatchID2 1 1002 120 3 1003 141 5 1006 150 6 1008 140 如果出现以下情况,我想用“失败”填充TableB col=status: 表B中MatchID1的所有matchID2不等于表A中相应MAatchID1的matchID2 在这种情况下,表B:120对应于1002,表A也是如此,因此不会失败。 预期结果: ID MatchID1 MatchID2 Status 1

表B

ID MatchID1 MatchID2
1   1002    120
3   1003    141
5   1006    150
6   1008    140
如果出现以下情况,我想用“失败”填充TableB col=status: 表B中MatchID1的所有matchID2不等于表A中相应MAatchID1的matchID2 在这种情况下,表B:120对应于1002,表A也是如此,因此不会失败。 预期结果:

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
注:
如果一条记录Match02不匹配,则使match01的整个集合失败。如表B中的id 6和7。提前感谢。

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

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

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

重新阅读。。还是不知道你问了什么

建议把你的努力分成小块

看来你需要几样东西:

一个小查询,仅从第一个表中获取具有或不具有不同匹配号的行。写下来

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

基于前两个查询设置值的更新


hth

如果您使用oracle,只需一个过程即可完成。仅使用SQL,我不能保证您能做到这一点。
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 
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
   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