2012-03-31 11 views
6

Ich habe Tabelle 1, all_countries, als folgt-MySQL Inner Join-Abfrage Aufzeichnungen Get nicht in anderer Tabelle

id | country 
------------------ 
1 | USA 
2 | China 
3 | India 
4 | France 
5 | UK 
6 | Australia 

und ich habe auch Tabelle 2, supported_countries, as -

id | country 
------------------ 
1 | USA 
2 | China 

Jetzt benötige ich eine Abfrage, die mir Ergebnisse liefern würde, die alle Länder einschließen, die NICHT unterstützt werden

So wie oben Beispiel sollte ich

bekommen

ich die folgende Abfrage verwenden -

SELECT ac.country VON all_countries ac INNER supported_countries sc ON sc.country_name JOIN = ac.country_name

Es funktioniert gut, es sei denn, Die Tabelle supported_countries ist leer, es werden keine Datensätze angezeigt. Wie erreiche ich dieses Ergebnis?

Antwort

24

A LEFT JOIN tun wird, dass elegant;

SELECT a.* 
FROM all_countries a 
LEFT JOIN supported_countries s 
    ON a.country = s.country 
WHERE s.id IS NULL; 

Demo here.

+0

Up-voting als ist klar formatiert - UND es funktioniert :) – Datadimension

3

versuchen, etwas wie folgt aus:

SELECT * FROM all_countries 
    WHERE country NOT IN (SELECT country FROM supported_countries) 
+0

das für mich funktioniert gut - nicht sicher, warum die Antwort nicht tat Arbeit ... – thevoipman

+3

Unterabfragen sind oft [weniger performant] (http://stackoverflow.com/questions/3856164/sql-joins-vs-sql-subqueries-performance) als explizite Joins. Sie sind leichter zu lesen, skalieren aber nicht gut. – jonathanbruder

1

SELECT ac.country VON all_countries ac LEFT JOIN supported_countries sc ON sc.country_name = ac.country_name WHERE ISNULL (sc.country_name)