SQL Abfrage mit mehreren Kriterien

sabrakadabra

Neuer Benutzer
Beiträge
2
Bin Anfänger, also bitte etwa Nachsicht, ich weiß aber nicht, wie ich das bewerkstelligen kann.

Ich habe die Tabelle "Listendetails" mit folgenden Spalten:
listen_id
produkt_id
menge
...

Beispiel für Datensätze:
listen_id / produkt_id / menge
1 / 1 / 1
1 / 2 / 1
2 / 1 / 1
2 / 2 / 2
...

Ich möchte nun "Listendetails" nach produkt_id und menge abfragen und möchte die listen_id bekommen. ich möchte z. b. wissen, welche liste einträge in listendetails hat für die gilt produkt_id = 1 und menge = 1 und produkt_id = 2 und menge = 1.

Eine Abfrage wie "select listen_id from Listendetails where produkt_id = 1 and menge = 1 and produkt = 2 and menge = 1" gibt logischerwise kein Ergebnis, weil produkt_id nicht 1 und 2 gleichzeitig sein kann. Als Ergebnis sollte ich listen_id 1 bekommen, weiß aber leider nicht, wie ich die SQL Abfrage entsprechend stellen muss.
 
Werbung:
bei "select listen_id from Listendetails where (produkt_id = 1 and menge = 1) or (produkt_id = 2 and menge = 1)

bekomme ich drei Ergebnisse zurück
listen_id
1
1
2

Das ist nicht das was ich möchte. Wenn ich z. B. weiß, dass Produkt1 mit Menge1 und Produkt2 mit Menge1 zusammen auf einer Liste stehen muss, möchte ich alle Listenids anzeigt bekommen, wo die Kombination "Produkt1 mit Menge1 und Produkt2 mit Menge1" vorkommt.

Beim Beispiel wäre das ein einzelnes Ergebnis zurück, listen_id = 1.
 
Code:
test=*# select * from sabrakadabra ;
 l | p | menge
---+---+-------
 1 | 1 |     1
 1 | 2 |     1
 2 | 1 |     1
 2 | 2 |     2
(4 rows)

test=*# select l from sabrakadabra where menge = 1 and p in (1,2) group by l having count(p) = 2;
 l
---
 1
(1 row)
 
Werbung:
alternativ:

Code:
test=*# with temp as (select l, array_agg(p) as p from sabrakadabra where menge = 1 group by l) select l from temp where p = array[1,2];
 l
---
 1
(1 row)
 
Zurück
Oben