Entwickler-Ecke

Datenbanken - Abfrage über 2 Tabellen und Bedingung in mehreren Zeilen


adfontes - Do 20.11.08 10:46
Titel: Abfrage über 2 Tabellen und Bedingung in mehreren Zeilen
Guten Morgen,

ich hoffe, der Titel verwirrt nicht schon genug oder ist einigermaßen treffend.

Nach einiger Zeit Datenbankenabstinenz hab ich mich mal wieder ein wenig damit befasst und bin auf ein Problem gestoßen, wo ich nicht wirklich weiter komme:

Ich habe momentan 2 Tabellen:

Tabelle 1 -> beinhaltet eine Spalte für Namen, eine für IDs und noch ein paar für die Abfrage uninteressante Informationen...
Tabelle 2 -> beinhaltet eine Spalte, in der die ID aus Tabelle 1 steht, eine eigene ID und eine Menge.

Nun würde ich gern folgendes machen:

Ich hätte gern eine SQL-Abfrage, sodass ich nur die "Namen" aus Tabelle 1 bekomme, deren Menge in Tabelle 2 größer als 2 ist. Problem ist, dass die Elemente aus Tabelle 1 in Tabelle 2 mehrere Mengen haben können. Also mal ein Beispiel zur Verdeutlichung:

Tabelle 1:

Name | ID | ...
-----------------
A | 1 | ....
B | 2 | ....
...

Tabelle 2:

ID | ID_aus_Tabelle_1 | Menge | ...
--------------------------------------
1 | 1 | 2 | ...
2 | 1 | 3 | ...
3 | 2 | 1 | ...
4 | 2 | 5 | ...
5 | 1 | 3 | ...
...

Die Ausgabe sollte hier nur "A" liefern, da "B" die Bedingung "Menge >= 2" in Tabelle 2 nicht in jeder Zeile erfüllt.

Kann mir da jemand helfen? Komme einfach nich weiter :(


lieben Gruß und danke fürs Lesen + Helfen schon mal im Vorraus :)
adf


baka0815 - Do 20.11.08 11:28

Auf die Schnelle:


SQL-Anweisung
1:
2:
select * from t1
where id not in (select t1_id from t2 where menge < 2)


Agawain - Do 20.11.08 11:38

Hi

das müßte passen



Delphi-Quelltext
1:
2:
3:
4:
SELECT t1.name Min(t2.menge) AS MinvonMenge
FROM t1 INNER JOIN t2 ON t1.id = t2.id
GROUP BY t1.id
HAVING Min(t2.menge)>=2


adfontes - Do 20.11.08 14:13

danke für die Antworten :) geht super...

jetzt muss ich mir nurnoch das mit dem INNER JOIN genauer anschaun, um auch zu verstehn was genau da passiert :)

lieben Gruß


Agawain - Do 20.11.08 14:31

hi

die Klausel inner kann man eigentlich hier auch weg lassen.

Ich schraub mir die Abfragen immer in Access zusammen und pass die nach Bedarf an.

Jedenfalls, einen left join würde man machen, wenn man alle Datensätze aus t1 haben wollte, auch wenn sie in t2 keine korrespondierenden Datensätze haben.

Macht hier aber natürlich keinen Sinn, weil die aufgrund der Bedingung eh raus fliegen würden.

Mit right join könnte man testen, ob in der n-Tabelle verwaiste Datensätze sind.

Sprich DS mit einer ID, die in t1 nicht vorhanden ist.


baka0815 - Do 20.11.08 15:22

Die Version mit JOIN und HAVING ist meiner Version auf jeden Fall vorzuziehen, da es auf den meisten DBMS (deutlich) schneller sein dürfte.
Die Verwendung von NOT IN ist einfach extrem langsam!

Alternativ ginge auch sowas (zumindest unter Oracle):

SQL-Anweisung
1:
2:
3:
SELECT t1.name
FROM t1 
WHERE (SELECT MIN(t2.Menge) FROM t2 WHERE t2.t1_id = t1.id) >=2