2016-06-19 7 views
1

Ich habe zwei Tabellen:Oracle SQL - Wert immer basierend auf einer Säule

TR_TRN (ID_WS, STORE, STATUS) 
TR_RTL (ID_WS, STORE, ID_LY) 

Der Status in TR_TRN ist entweder 19 oder 20

Einige Aufzeichnungen haben sowohl die Zustände 19 und 20 und einige haben nur 19 (was bedeutet, dass sie Transaktionen anhängig)

die beiden Tabellen sind verbunden mit:

ID_WS and STORE 

Ich brauche alle Datensätze von TR_RTL, die in der Tabelle TR_TRN nur den Status 19 haben.

Wie mache ich das?

Antwort

2

können Sie EXISTS() verwenden und die HAVING Klausel in der inneren Abfrage, um festzustellen, ob dieser Datensatz nur status = 19 mit CASE EXPRESSION hat:

SELECT * FROM TR_RTL t 
WHERE EXISTS(SELECT 1 FROM TR_TRN s 
      WHERE s.id_ws = t.id_ws and s.store = t.store 
      HAVING COUNT(CASE WHEN s.status = 19 THEN 1 END) = 1 
       AND COUNT(CASE WHEN s.status = 20 THEN 1 END) = 0) 
0

Um alle IDs (ID_WS, STORE) zu erhalten, den Status 19 und don ‚t haben den Status 20 verwenden Sie die folgende Abfrage

select ID_WS, STORE from TR_TRN where STATUS = 19 
minus 
select ID_WS, STORE from TR_TRN where STATUS = 20; 

Der Rest eine einfache IN subquery ist wählen:

select * from TR_RTL 
where (ID_WS, STORE) IN 
(
select ID_WS, STORE from TR_TRN where STATUS = 19 
minus 
select ID_WS, STORE from TR_TRN where STATUS = 20 
); 
Verwandte Themen