Autor Beitrag
adfontes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win7 (64bit), WinXP
Delphi 2010 Prof, Delphi XE2 (Trial)
BeitragVerfasst: Do 20.11.08 10:46 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 20.11.08 11:28 
Auf die Schnelle:

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


Zuletzt bearbeitet von baka0815 am Do 20.11.08 11:44, insgesamt 1-mal bearbeitet
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: Do 20.11.08 11:38 
Hi

das müßte passen


ausblenden 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

_________________
Gruß Aga
adfontes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win7 (64bit), WinXP
Delphi 2010 Prof, Delphi XE2 (Trial)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: 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.

_________________
Gruß Aga
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: 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):
ausblenden SQL-Anweisung
1:
2:
3:
SELECT t1.name
FROM t1 
WHERE (SELECT MIN(t2.Menge) FROM t2 WHERE t2.t1_id = t1.id) >=2