MySQL内联查询以获取另一张表中不存在的记录

15

我有一个名为all_countries的表1,内容如下-

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

而且我还有第二个表格,名为supported_countries -

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

现在我需要一个查询,该查询将给出包括所有不受支持的国家在内的结果

因此,根据上面的示例,我应该得到

India
France
UK
Australia

我正在使用以下查询 -

SELECT ac.country FROM all_countries ac LEFT JOIN supported_countries sc ON sc.country_name = ac.country_name WHERE sc.country_name IS NULL

它运行良好,但当supported_countries表为空时,它不显示任何记录。如何实现这个结果?

4个回答

43

LEFT JOIN可以优雅地实现这一点;

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

这里有个示例


5
尝试类似以下的内容:
SELECT * FROM all_countries 
  WHERE country NOT IN (SELECT country FROM supported_countries)

8
子查询比显式连接通常较慢。尽管子查询更易于阅读,但不具备良好的可扩展性。 - terrabruder

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

0

虽然 @Joachim Isaksson 给了我提示,但我测试了这个非常相似的查询,并通过替换变量来处理我的数据库。

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

我给了这个问题和Joachim的答案点赞。干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接