Sql 基于第二个表中的多个引用选择行
这是一个具有代表性的数据样本。在第一个表中,第2行和第3行不正确。只有当表2中存在状态为B的行而不存在状态为C的行时,表1中的行才应处于活动状态Sql 基于第二个表中的多个引用选择行,sql,oracle,Sql,Oracle,这是一个具有代表性的数据样本。在第一个表中,第2行和第3行不正确。只有当表2中存在状态为B的行而不存在状态为C的行时,表1中的行才应处于活动状态 +----+--------+--+ +-----+-----+--------+ | ID | ACTIVE | | | ID | REF | STATUS | +----+--------+--+ +-----+-----+--------+ | 1 | 0 | | | 9 | 1 | A | |
+----+--------+--+ +-----+-----+--------+
| ID | ACTIVE | | | ID | REF | STATUS |
+----+--------+--+ +-----+-----+--------+
| 1 | 0 | | | 9 | 1 | A |
| 2 | 1 | | | 100 | 2 | A |
| 3 | 1 | | | 103 | 2 | B |
| 4 | 1 | | | 104 | 2 | C |
+----+--------+--+ | 111 | 3 | A |
| 123 | 4 | A |
| 126 | 4 | B |
+-----+-----+--------+
如何根据这些规则将第2行和第3行中的active(活动)设置为0?您可以使用update以及您描述的逻辑:
update t1
set active = (case when exists (select 1 from t2 where t2.ref = t1.id and t2.status = 'B') and
not exists (select 1 from t2 where t2.ref = t1.id and t2.status = 'C')
then 1 else 0
end);
您可以将update与您描述的逻辑一起使用:
update t1
set active = (case when exists (select 1 from t2 where t2.ref = t1.id and t2.status = 'B') and
not exists (select 1 from t2 where t2.ref = t1.id and t2.status = 'C')
then 1 else 0
end);
如果您只想更新应该为零的行,而不想使用任何其他行
UPDATE TABLE_A A
SET A.ACTIVE = 0
WHERE A.A_ID IN
( SELECT b.ref
FROM TABLE_B B
WHERE NOT EXISTS (SELECT 1
FROM TABLE_B
WHERE STATUS = 'B'
AND B.REF = REF)
OR EXISTS
(SELECT 1
FROM TABLE_B
WHERE STATUS = 'C'
AND B.REF = REF))
AND a.active<>0;
如果您只想更新应该为零的行,而不想使用任何其他行
UPDATE TABLE_A A
SET A.ACTIVE = 0
WHERE A.A_ID IN
( SELECT b.ref
FROM TABLE_B B
WHERE NOT EXISTS (SELECT 1
FROM TABLE_B
WHERE STATUS = 'B'
AND B.REF = REF)
OR EXISTS
(SELECT 1
FROM TABLE_B
WHERE STATUS = 'C'
AND B.REF = REF))
AND a.active<>0;
看起来很好,但是如果我想不去管那些应该是1的,只接触那些应该从1变为0的看起来很好,但是如果我想不管那些应该是1的,只接触那些应该从1变为0的呢