SQL Befehl für Schnittmenge mit Bedingung

Hallo zusammen,

Ich bin Postgres Neuling und auf der Suche nach einem SQL Befehl. Folgende Datensätze sind in der Datenbank gespeichert:

Felder: Lager_ID, Box_ID, Farbe_ID, Inhalt

Lager_ID Box_ID Farbe_ID Inhalt
Lager_1 Box_1 schwarz 12
Lager_1 Box_2 schwarz 13
Lager_1 Box_3 weiss 14
Lager_1 Box_4 schwarz 15
Lager_1 Box_5 schwarz 16
Lager_1 Box_6 schwarz 17
Lager_2 Box_3 schwarz 18
Lager_2 Box_5 schwarz 19
Lager_2 Box_6 schwarz 20
Lager_2 Box_10 schwarz 21
Lager_2 Box_11 schwarz 22
Lager_2 Box_12 schwarz 23
Lager_3 Box_1 schwarz 24
Lager_3 Box_5 schwarz 25
Lager_3 Box_6 schwarz 26
Lager_4 Box_7 schwarz 27
Lager_5 Box_8 schwarz 28
Lager_6 Box_9 schwarz 29


Mit welchem SQL Befehl finde ich die Boxen nur aus Lager_1 und Lager_2, die schwarz sind und die übereinstimmende Box_IDs haben? Die Ausgabe soll also folgendermasen aussehen:

Lager_1 Box_5 schwarz 16
Lager_1 Box_6 schwarz 17
Lager_2 Box_5 schwarz 19
Lager_2 Box_6 schwarz 20

Danke schon im Voraus für jede Idee

Gruß
Ludwig



test=*# select * from heinrichen ;
 lager_id | box_id | farbe_id | inhalt
----------+--------+----------+--------
 Lager_1  | Box_1  | schwarz  |     12
 Lager_1  | Box_2  | schwarz  |     13
 Lager_1  | Box_3  | weiss    |     14
 Lager_1  | Box_4  | schwarz  |     15
 Lager_1  | Box_5  | schwarz  |     16
 Lager_1  | Box_6  | schwarz  |     17
 Lager_2  | Box_3  | schwarz  |     18
 Lager_2  | Box_5  | schwarz  |     19
 Lager_2  | Box_6  | schwarz  |     20
 Lager_2  | Box_10 | schwarz  |     21
 Lager_2  | Box_11 | schwarz  |     22
 Lager_2  | Box_12 | schwarz  |     23
 Lager_3  | Box_1  | schwarz  |     24
 Lager_3  | Box_5  | schwarz  |     25
 Lager_3  | Box_6  | schwarz  |     26
 Lager_4  | Box_7  | schwarz  |     27
 Lager_5  | Box_8  | schwarz  |     28
 Lager_6  | Box_9  | schwarz  |     29
(18 rows)

Time: 0,191 ms
test=*# select * from heinrichen where lager_id in ('Lager_1','Lager_2') and farbe_id = 'schwarz' and box_id in (select box_id from heinrichen where lager_id = 'Lager_1' and farbe_id = 'schwarz' intersect select box_id from heinrichen where lager_id = 'Lager_2' and farbe_id = 'schwarz');
 lager_id | box_id | farbe_id | inhalt
----------+--------+----------+--------
 Lager_1  | Box_5  | schwarz  |     16
 Lager_1  | Box_6  | schwarz  |     17
 Lager_2  | Box_5  | schwarz  |     19
 Lager_2  | Box_6  | schwarz  |     20
(4 rows)

Hallo akretschmer,

besten Dank für die schnelle Hilfe. Klappr wunderbar !!!

Ich übertrage das Morgen früh auf die Produktivdatenbank mit 5 mio Einträgen. Ich hoffe die Performance geht einigermassen.

Ich melde mich dazu nochmal.

Gruß
Ludwig

Nutze Explain. Indexe auf farbe_id und (lager_id, farbe_id) könnten sinnvoll sein.

Klappt prima, auch in der Produktionsdatenbank. Indexe mit var_ops ertsellt.

Vielen Dank