Wie erstellen Sie eine SQL-Anweisung, die Ergebnisse zurückgibt, die von einer Unterabfrage oder einem Join - oder etwas anderem - geändert wurden, das sich mit Informationen befasst, die Sie zurückgeben möchten?SQL: "NICHT IN" Alternative zum Auswählen von Zeilen basierend auf Werten von * verschiedenen * Zeilen?
Zum Beispiel:
CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
Jemand falsch auf mehr als ein Team sein könnte:
INSERT INTO `bowlers` (`name`, `team`) VALUES
('homer', 'pin pals'),
('moe', 'pin pals'),
('carl', 'pin pals'),
('lenny', 'pin pals'),
('homer', 'The homer team'),
('bart', 'The homer team'),
('maggie', 'The homer team'),
('lisa', 'The homer team'),
('marge', 'The homer team'),
('that weird french guy', 'The homer team');
So homer
kann nicht auf seinem Team entscheiden, so ist er auf beides. Do'h!
Ich möchte alle wissen, wer ist, the homer team
Wer ist nicht auch auf dem pin pals
Team. Das Beste, was ich tun kann, ist dies:
SELECT a.name, a.team
FROM bowlers a where a.team = 'The homer team'
AND a.name
NOT IN (SELECT b.name FROM bowlers b WHERE b.team = 'pin pals');
Resultat:
+-----------------------+----------------+
| name | team |
+-----------------------+----------------+
| bart | The homer team |
| maggie | The homer team |
| lisa | The homer team |
| marge | The homer team |
| that weird french guy | The homer team |
+-----------------------+----------------+
5 rows in set (0.00 sec)
Welche, wissen Sie, brilliant!
Die Leistung wird darunter leiden, da die Unterabfrage für jedes Ergebnis der Abfrage ausgeführt werden wird, was ziemlich schlecht B zu A zu D. Groß für ein paar Zeilen, für die Hunderttausende von Reihen.
Was ist ein besserer Weg? Ich denke meistens, dass ein Self Join den Trick machen würde, aber ich kann mir nicht vorstellen, wie ich das machen soll.
Gibt es noch andere Möglichkeiten, dies zu tun, ohne Verwendung von NOT IN(SELECT ...)
Auch, was ist der Name für diese Art von Problem?
linken äußeren Join zurück zu sich selbst ist, was Sie wollen. –