2013-04-08 5 views
5

ich eine SELECT-Anweisung für MySQL zu komponieren versuche, die aus der Tabelle wählen A, was nicht zum Beispiel in Tabelle B nicht vorhanden ist:Wählen Sie aus Tabelle A, die in Tabelle B existiert nicht

Tabelle A:

+------+ 
| BAND | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+------+ 

Tabelle B:

+------+ 
| HATE | 
+------+ 
| 1 | 
| 5 | 
+------+ 

Also, wenn Tabelle A alle Bands sind, und Tabelle B sind die Bands, die ich hasse, dann nur ich will Bands, die ich nicht hassen. So sollte das Ergebnis einer Auswahl sein:

+------+ 
| BAND | 
+------+ 
| 2 | 
| 3 | 
| 4 | 
+------+ 

Wie würde ich eine einzelne Auswahl für diese schreiben? Hier war mein letzter Versuch:

SELECT * FROM A LEFT JOIN B ON A.BAND = B.HATE WHERE B.HATE IS NULL; 

EDIT: Die Zeile oben wurde behoben! Siehe Kommentare unten ... "= NULL" versus "IS NULL".

+1

@Michelle Ihre Abfrage in Ordnung zu sein scheint. Warum sagst du, dass es nicht funktioniert? – Barranka

+0

Siehe meinen Kommentar unten. Für alle anderen mit dem gleichen Problem ist "IS NULL" in MySQL nicht gleich "= NULL". Ich habe versucht, eine Möglichkeit und die Abfrage funktioniert, auf die andere Weise gibt es eine leere Menge zurück. Seltsam!!! – TSG

+0

Nicht nur in MySQL, sondern in jedem SQL-Dialekt. Der 'NULL'-Wert in SQL hat die Eigenschaft, sich von jedem anderen Wert zu unterscheiden, einschließlich eines anderen' NULL'. Aus diesem Grund können Sie nicht erwarten, dass '= NULL' an einer SQL-Abfrage arbeitet ... Sie müssen' IS NULL' verwenden. – Barranka

Antwort

16

ich einen Join

select A.* 
from A left join B on A.BAND = B.HATE 
where B.HATE IS NULL; 

Erinnern Sie verwenden würden: Erstellen Sie die entsprechenden Indizes für die Tabelle

+0

Das ist fast identisch mit dem, was ich versucht habe (siehe Antwort oben). Sie fragen nur nach A. * als Gegenleistung für eine bestimmte Aussage ... vielleicht ist das das Problem. – TSG

+0

und es sollte Ihnen die richtige Antwort geben! (übrigens habe ich das vor deiner Bearbeitung gepostet). Dies sollte zurückgeben, was Sie brauchen. Oder warum sagst du, dass es nicht zurückgibt, was du brauchst? – Barranka

+0

OK - Ich habe das Problem gefunden! Ich habe für "B.HATE = NULL" getestet, nicht "B.HATE IS NULL". Mein Text oben war das, was ich verwendet habe, um meinen SQL-Befehl zu erstellen, aber als ich den Code tatsächlich eingegeben habe (in eine PHP-Zeichenfolge), änderte ich ihn in = NULL. Seltsam, dass sie anders sind !? – TSG

5

Sie können IN verwenden, aber es ist super ineffizient:

SELECT * FROM tableA WHERE id NOT IN (SELECT id FROM tableB) 
+2

Warum ist das besser als eine Verbindung? –

+2

Ich denke, das ist langsam, wenn die Tabellen A oder B groß sind (für kleine Tabellen ist der Leistungsunterschied praktisch nichts) – Barranka

+1

Ich habe nie gesagt, dass es besser ist, ich sage eigentlich das Gegenteil. 'IN' saugt, weil es die innere Abfrage für jede überprüfte Zeile ausführt (also für jede Zeile in' tableA'). –

0
SELECT * FROM tableA WHERE id NOT EXISTS (SELECT DISTINCT id FROM tableB) 

oder

SELECT * FROM tableA WHERE id NOT EXISTS (SELECT id FROM tableB GROUP BY id) 
-2
SELECT BAND FROM A WHERE BAND NOT EXISTS(SELECT DISTINCT HATE FROM B) 

ODER

SELECT BAND FROM A WHERE NOT EXISTS (SELECT HATE FROM B WHERE A.BAND = B.HATE); 
Verwandte Themen