2016-05-10 5 views
0

Hier ist eine repräsentative Stichprobe von Daten. In der ersten Tabelle sind die Zeilen 2 und 3 falsch. Eine Zeile in Tabelle 1 sollte nur dann aktiv sein, wenn es eine Zeile mit Status B existiert und es keine Zeile mit dem Status C in Tabelle 2.Auswählen von Zeilen basierend auf mehreren Referenzen in der zweiten Tabelle

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

existiert Wie kann ich aktiv gesetzt in den Reihen 2 und 3-0 basierend auf diesen Regeln?

Antwort

1

Wenn Sie nur die Zeilen aktualisieren möchten, die Null sein sollte und alles andere in Ruhe lassen, als Sie

   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; 
2

können Sie update die Logik entlang Withe verwenden, die Sie beschreiben:

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); 
+0

verwenden können Sieht ganz gut aus, aber was ist, wenn ich die, die 1 sein sollten, alleine lassen sollte und nur diejenigen berühren sollte, die von 1 auf 0 wechseln sollten – Andrew

Verwandte Themen