Da es mir keine Ruhe lässt, eine Lösung ohne Subselect zu finden, hab' ich mal den ChatBot meiner Wahl befragt, diese Lösung wurde extrem schnell geliefert:
Zitat von
Frage:
Ich möchte alle Kunden haben, die den Artikel X gekauft haben und nie den Artikel Y gekauft haben. (Hinweis die Artikel X und Y können in verschiedenen Rechnungen des selben Kunden auftreten). Die Tabellen sehen so aus:
Kunden
------
KdNr, Name, ...
Rechnungen
-----------
KdNr, ReNr, ....
Positionen
----------
ReNr, Artikel, ....
Zitat von
Antwort:
Sie können die folgende
SQL-Abfrage verwenden, um alle Kunden zu finden, die Artikel X gekauft haben und nie Artikel Y gekauft haben. Bitte ersetzen Sie 'X' und 'Y' durch Ihre tatsächlichen Artikelnamen.
SQL-Code:
SELECT k.*
FROM Kunden k
WHERE EXISTS (
SELECT 1
FROM Rechnungen r
JOIN Positionen p ON r.ReNr = p.ReNr
WHERE r.KdNr = k.KdNr AND p.Artikel = 'X'
)
AND NOT EXISTS (
SELECT 1
FROM Rechnungen r
JOIN Positionen p ON r.ReNr = p.ReNr
WHERE r.KdNr = k.KdNr AND p.Artikel = 'Y'
)
Zitat von
Fortsetzung der Antwort:
In dieser Abfrage wird zuerst geprüft, ob ein Kunde einen Artikel X gekauft hat ('EXISTS'-Teil), und dann wird sichergestellt, dass der Kunde nie einen Artikel Y gekauft hat ('NOT EXISTS'-Teil).
Aber, wir möchten es doch ohne Subselect, daher eine Nachfrage:
Zitat von
Frage:
Gibt es auch eine Lösungsmöglichkeit für diese Fragestellung, die ohne Subselect auskommt?
Zitat von
Antwort:
Ja, es ist möglich, eine Lösung ohne Subselects zu erstellen, indem Sie 'JOIN' und 'GROUP BY' verwenden. Hier ist ein Beispiel:
SQL-Code:
SELECT k.KdNr, k.Name
FROM Kunden k
JOIN Rechnungen r ON k.KdNr = r.KdNr
JOIN Positionen p ON r.ReNr = p.ReNr
GROUP BY k.KdNr, k.Name
HAVING SUM(CASE WHEN p.Artikel = 4701 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN p.Artikel = 5702 THEN 1 ELSE 0 END) = 0
Zitat von
Fortsetzung der Antwort:
In dieser Abfrage wird die 'SUM'-Funktion mit einer 'CASE'-Anweisung verwendet, um zu zählen, wie oft jeder Kunde Artikel X und Y gekauft hat. Kunden, die Artikel X mindestens einmal gekauft haben und Artikel Y nie gekauft haben, werden in den Ergebnissen enthalten sein.
Bitte beachten Sie, dass diese Abfrage möglicherweise nicht so effizient ist wie die vorherige mit Subselects, insbesondere wenn Ihre Tabellen sehr groß sind. Es ist immer eine gute Idee, die Leistung zu überwachen und gegebenenfalls Indizes hinzuzufügen.
Es geht also doch