【问题标题】:MySQL Inner Join Query To Get Records Not Present in Other TableMySQL内部连接查询以获取其他表中不存在的记录
【发布时间】: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 表为空,它不显示任何记录。如何达到这个效果?

【问题讨论】:

    标签: mysql


    【解决方案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 的回答让我竖起大拇指。干杯!

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 2018-07-13
          • 2020-12-09
          • 1970-01-01
          • 2017-11-11
          • 2014-09-09
          • 1970-01-01
          相关资源
          最近更新 更多