2017-01-27 6 views
-1

ich eine Tabelle von Daten, die etwa wie folgt aussieht:Abfrage identifizieren Datensätze ohne bestimmte Werte

ID Num | Code 
------------- 
    1 | A 
    1 | B 
    1 | C 
    1 | D 
    2 | A 
    2 | B 
    3 | A 
    3 | B 
    3 | D 
    4 | B 
    5 | A 
    5 | B 
    5 | E 

Und ich muss in der Lage sein eine SQL-Abfrage zu schreiben, mir alle ID-Nummern zu zeigen, die nicht über Codes C oder D sind ihnen zugeordnet. (Was in diesem Beispiel wäre ID-Nummern 2, 4, & 5.)

Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können!

+0

Es tut mir leid. Es ist DB2. –

Antwort

1

ich NICHT verwenden würde:

SELECT DISTINCT ID_Num 
FROM t 
WHERE ID_Num NOT IN 
(SELECT ID_Num 
FROM t 
WHERE code = 'C' 
OR code = 'D') 
1

Ich mag diese Art von Fragen nähern group by und having mit:

select id_num 
from t 
group by id_num 
having sum(case when code in ('C', 'D') then 1 else 0 end) = 0; 
0

Sie ‚nicht existiert‘ verwenden können (oft mehr performant von nicht in)

SELECT DISTINCT ID_Num 
FROM yourtable f1 
WHERE not exists 
(
    SELECT * FROM yourtable f2 
    WHERE f2.code in ('C', 'D') and f2.ID_Num=f1.ID_Num 
) 
0

können Sie 'links außen join lateral' verwenden und nicht gegründet r wie folgt:

SELECT DISTINCT f1.ID_Num 
FROM yourtable f1 
LEFT OUTER JOIN LATERAL 
(
    SELECT f2.ID_Num FROM yourtable f2 
    WHERE f2.code in ('C', 'D') AND f2.ID_Num=f1.ID_Num 
    FETCH FIRST ROWS ONLY 
) f3 on 1=1 
WHERE f3.ID_Num is null 
Verwandte Themen