14

I have table 1, all_countries, as follows-

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

and I also have table 2, supported_countries, as -

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

Now I need a query that would give me result that includes all countries that ARE NOT supported

So as per above example I should get

India
France
UK
Australia

I am using the following query -

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

It works fine, except when supported_countries table is empty, it doesn't show any records. How to achieve this result?

skos
  • 3,924
  • 8
  • 33
  • 58

4 Answers4

42

A LEFT JOIN will do that elegantly;

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

Demo here.

Joachim Isaksson
  • 170,943
  • 22
  • 265
  • 283
4

Try something like the following:

SELECT * FROM all_countries 
  WHERE country NOT IN (SELECT country FROM supported_countries)
Abel
  • 54,106
  • 22
  • 138
  • 236
IT ppl
  • 2,578
  • 1
  • 38
  • 54
  • 7
    Subqueries are often [less performant](http://stackoverflow.com/questions/3856164/sql-joins-vs-sql-subqueries-performance) than explicit joins. They are easier to read, but do not scale well. – terrabruder Mar 03 '14 at 22:55
1
SELECT ac.country FROM all_countries ac 
LEFT JOIN supported_countries sc ON 
sc.country_name = ac.country_name
WHERE ISNULL(sc.country_name)
toonice
  • 2,190
  • 1
  • 12
  • 20
Nilesh
  • 1,109
  • 9
  • 12
0

While @Joachim Isaksson gave me the clue, I tested this very similar query and worked on my database by replacing variables.

SELECT * FROM all_countries 
LEFT JOIN supported_countries ON all_countries.id = supported_countries.id 
WHERE supported_countries.id IS NULL

I gave the question and that Joachim's answer my thumbs up. Cheers !