Forum: Datenbanken
by jaenicke,
10. Apr 2024
sum über case ist aber vermutlich die langsamste Variante, weil dies kaum optimiert werden kann. Meine letzte Variante ist auch kein echtes Subselect, weil die zweite Abfrage mit join kombiniert und nicht in jeder Zeile ausgeführt wird.
Holger hat mit seinem Einwand aber natürlich auch Recht:
Forum: Datenbanken
by jaenicke,
10. Apr 2024
Ja, da hast du Recht. Mit einem join in der Form sollte es aber gehen:
SELECT DISTINCT K.KdNr, K.Name
FROM Kunden K
INNER JOIN Rechnungen R ON K.KdNr = R.KdNr
INNER JOIN Positionen PA ON R.ReNr = PA.ReNr AND PA.Artikel = 4701
LEFT JOIN (
SELECT DISTINCT R.KdNr
FROM Rechnungen R
INNER JOIN Positionen PB ON R.ReNr = PB.ReNr
WHERE PB.Artikel = 5702
Forum: Datenbanken
by jaenicke,
10. Apr 2024
Nein, denn wie du sagst, die Kunden mit B fliegen in der Zeile ja schon raus.
Forum: Datenbanken
by jaenicke,
10. Apr 2024
Das ist ja auch die Anforderung. Es sollen alle Kunden, die Artikel A gekauft haben, drin sein, und von denen nur die, die B nicht gekauft haben.
Man könnte auch nur LEFT JOINs verwenden, aber sofern die Tabellen indiziert sind, sollte es mit dem INNER JOIN schneller sein. Beim dritten JOIN muss wiederum ein LEFT JOIN verwendet werden, damit die Nullwerte erhalten bleiben.
Forum: Datenbanken
by jaenicke,
9. Apr 2024
Wie wäre es so?
SELECT DISTINCT K.*
FROM Kunden K
INNER JOIN Rechnungen R ON K.KdNr = R.KdNr
INNER JOIN Positionen P1 ON R.ReNr = P1.ReNr AND P1.Artikel = A
LEFT JOIN Positionen P2 ON R.ReNr = P2.ReNr AND P2.Artikel = B
WHERE P2.ReNr IS NULL;
Eine Zählung ist ja nicht notwendig. Es geht ja nur um die Existenz.
Testcode für https://sqliteonline.com/