【问题标题】:Selecting rows based on multiple references in second table根据第二个表中的多个引用选择行
【发布时间】:2016-05-10 22:48:00
【问题描述】:

这是一个具有代表性的数据样本。在第一个表中,第 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?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用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);
    

    【讨论】:

    • 看起来不错,但如果我想不理会应该为 1 的那些,而只触摸应该从 1 变为 0 的那些怎么办
    【解决方案2】:

    如果您只想更新应该为零的行,而将其他所有内容都放在一边,而不是您可以使用

                  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;
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2016-11-07
      • 2012-05-21
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多