MySQL内部连接查询以获取其他表中不存在的记录
Posted
技术标签:
【中文标题】MySQL内部连接查询以获取其他表中不存在的记录【英文标题】:MySQL Inner Join Query To Get Records Not Present in Other Table 【发布时间】:2012-04-14 20:00:28 【问题描述】:我有表1,all_countries,如下-
id | country
------------------
1 | USA
2 | China
3 | India
4 | France
5 | UK
6 | Australia
我还有表 2,supported_countries,作为 -
id | country
------------------
1 | USA
2 | China
现在我需要一个查询,它会给我包含所有不受支持的国家/地区的结果
所以按照上面的例子我应该得到
India
France
UK
Australia
我正在使用以下查询 -
SELECT ac.country FROM all_countries ac INNER JOIN supported_countries sc ON sc.country_name != ac.country_name
它工作正常,除非supported_countries 表为空,它不显示任何记录。如何达到这个效果?
【问题讨论】:
【参考方案1】:尝试以下方法:
SELECT * FROM all_countries
WHERE country NOT IN (SELECT country FROM supported_countries)
【讨论】:
子查询通常是less performant,而不是显式连接。它们更易于阅读,但不能很好地扩展。【参考方案2】:LEFT JOIN
会优雅地做到这一点;
SELECT a.*
FROM all_countries a
LEFT JOIN supported_countries s
ON a.country = s.country
WHERE s.id IS NULL;
演示here.
【讨论】:
【参考方案3】:SELECT ac.country FROM all_countries ac
LEFT JOIN supported_countries sc ON
sc.country_name = ac.country_name
WHERE ISNULL(sc.country_name)
【讨论】:
【参考方案4】:虽然@Joachim Isaksson 给了我线索,但我测试了这个非常相似的查询,并通过替换变量来处理我的数据库。
SELECT * FROM all_countries
LEFT JOIN supported_countries ON all_countries.id = supported_countries.id
WHERE supported_countries.id IS NULL
我提出了这个问题,而 Joachim 的回答让我竖起大拇指。干杯!
【讨论】:
以上是关于MySQL内部连接查询以获取其他表中不存在的记录的主要内容,如果未能解决你的问题,请参考以下文章