2016-06-09 8 views
0

Ich habe ein Problem mit einem Resultset-Filter.SQL Filter Resultset in WHERE-Klausel

My SQL-Abfrage gibt eine Liste, die wie folgt aussieht:

LOAD_NR -------- REASON_ID 
399    19 
399    20 
399    21 
399    22 
400    19 
400    20 
401    20 
402    20 

Nun würde Ich mag eine Liste von Last Zahlen haben, die zum Beispiel haben Reason_ID = 19 UND Reason_ID = 20. In diesem Beispiel wäre das: 399 und 400.

Ich verwende eine Firebird-Datenbank.

+0

Was ist Ihre SQL-Abfrage? @SWYM – yafater

+0

Bei SQL-Abfragen sollten Sie immer das verwendete DBMS markieren. Zum Beispiel haben einige DBMS das Merkmal "INTERSECT", während andere dies nicht tun. (Das wäre: 'wähle load_nr aus mytable, wo sich reason_id = 19 kreuzt, wähle load_nr aus meiner Tabelle, wo reason_id = 20'.) –

+0

Es ist nicht einfach, es enthält viele Joins. – SWYM

Antwort

0

Versuchen Sie folgendes:

SELECT LOAD_NR 
FROM mytable 
WHERE REASON_ID IN (19, 20) 
GROUP BY LOAD_NR 
HAVING COUNT(DISTINCT REASON_ID) = 2 
+0

Danke, es ist keine komplette Lösung für mein Problem, aber es gab mir einen guten Hinweis, wie ich es lösen kann;) edit: schade, ich brauche 4 mehr Ruf, um dich aufzuschreiben posting :( – SWYM

0

Sie müssen alle Werte auszuwählen, die beide Bedingungen erfüllen, so dass Sie Existenz müssen separat überprüfen:

select distinct load_nr 
from thetable a 
where exists (select 1 from thetable where load_nr = a.load_nr and reason_id = 19) 
and exists (select 1 from thetable where load_nr = a.load_nr and reason_id = 20) 

Alternativ Ihre ANY (or SOME) verwenden könnte, aber das wird wahrscheinlich schlechtere Leistung haben:

select distinct load_nr 
from thetable a 
where 19 = any (select reason_id from thetable where load_nr = a.load_nr) 
and 20 = any (select reason_id from thetable where load_nr = a.load_nr)