2016-07-28 13 views
-1

Ich habe die folgenden zwei Tabellen und benötigen eine einzige SQL mit diesen Anforderungen (keine UNION).SQL dynamische Where-Klausel basierend auf der übergeordneten Tabelle Spalte

Wenn CHECK_CHILDFALSE ist, dann geben Sie einfach Zeilen aus der übergeordneten Tabelle zurück. Wenn CHECK_CHILDTRUE ist, überprüfen Sie, ob in der Tabelle CHILD eine Referenzzeile vorhanden ist, und geben Sie die Zeile PARENT zurück. Wenn in der Tabelle CHILD keine Referenzzeile vorhanden ist, geben Sie die Zeile PARENT nicht zurück.

PARENT Table 
    ID   INT (PK) 
    CHECK_CHILD BOOLEAN 

    CHILD TABLE 
    ID   INT (PK) 
    PARENT_ID INT (FK) 

Beispieldaten:

PARENT Table 
    ------------ 
    ID CHECK_CHILD 
    1  FALSE 
    2  TRUE 
    3  TRUE 

    CHILD Table 
    ----------- 
    ID PARENT_ID 
    1  2 

Mit diesen Beispieldaten sollten die Abfrage zuerst zwei Zeilen aus der Master-Tabelle zurück, weil dritte Reihe nicht Referenzreihe in der untergeordneten Tabelle hat.

+0

Blick auf die 'CASE WHEN' Aussage und sehen, ob das Ihren Bedürfnissen entspricht? – Dave

+1

Fügen Sie einige Beispieltabellendaten hinzu und das erwartete Ergebnis! – jarlh

+0

@a_horse_with_no_name - DB2 – gan1975

Antwort

0

Ein paar Alternativen:

select P.* 
from PARENT P 
left outer join CHILD C 
    on C.PARENT_ID = P.ID 
where P.CHECK_CHILD = 'FALSE' 
    or C.PARENT_ID is not null 

oder

select * 
from PARENT P 
where P.CHECK_CHILD = 'FALSE' 
    or (
    P.CHECK_CHILD = 'TRUE' 
    and exists (select 1 from CHILD C where C.PARENT_ID = P.ID) 
    ) 
+0

Danke @mustaccio, die zweite Logik ist einfach und es funktioniert gut. – gan1975