Sql 基于第二个表中的多个引用选择行

Sql 基于第二个表中的多个引用选择行,sql,oracle,Sql,Oracle,这是一个具有代表性的数据样本。在第一个表中,第2行和第3行不正确。只有当表2中存在状态为B的行而不存在状态为C的行时,表1中的行才应处于活动状态 +----+--------+--+ +-----+-----+--------+ | ID | ACTIVE | | | ID | REF | STATUS | +----+--------+--+ +-----+-----+--------+ | 1 | 0 | | | 9 | 1 | A | |

这是一个具有代表性的数据样本。在第一个表中,第2行和第3行不正确。只有当表2中存在状态为B的行而不存在状态为C的行时,表1中的行才应处于活动状态

+----+--------+--+   +-----+-----+--------+
| 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的呢