【问题标题】:Getting different results from Subquery and JOIN which seem to be the same从 Subquery 和 JOIN 获得不同的结果,这似乎是相同的
【发布时间】:2022-01-18 17:20:26
【问题描述】:

我在 DataCamp 上做一个挑战题。它使用两个表,“经济”包含按国家/地区代码划分的经济信息,“国家/地区”包含按国家/地区代码划分的一般国家/地区信息。

挑战是:从“经济”表中获取 2015 年的国家代码、通货膨胀率和失业率,其中 gov_form 在“国家”表中不是“Constitutional Monarchy”或“%Republic%”。

使用 LEFT JOIN 我得到 20 个结果:

SELECT e.code, e.inflation_rate, e.unemployment_rate, c.gov_form
FROM economies AS e
LEFT JOIN countries AS c
   ON c.code = e.code
WHERE c.gov_form <> 'Constitutional Monarchy'
   AND c.gov_form NOT LIKE '%Republic%'
   AND e.year = 2015
ORDER BY e.inflation_rate;

使用子查询我得到 26 个结果:

SELECT code, inflation_rate, unemployment_rate
  FROM economies
  WHERE year = 2015 AND code NOT IN
    (SELECT code
     FROM countries
     WHERE (gov_form = 'Constitutional Monarchy' OR gov_form LIKE '%Republic%'))
ORDER BY inflation_rate;

似乎JOIN版本排除了“国家”表中不存在的国家(它们只存在于“经济”表中),例如ROU(罗马尼亚)。但是,我认为左侧带有“经济”的 LEFT JOIN 将包括该表中的所有行,并且无论它们是否存在于右表中都不会删除它们?

感谢任何建议。

【问题讨论】:

标签: sql join subquery left-join


【解决方案1】:

在第一个查询中,您通过在连接表的字段上设置条件来破坏left join 的效果。例如,当没有满足连接条件的country 记录时,c.gov_form &lt;&gt; 'Constitutional Monarchy' 将为 false,因为此时c.gov_form 就是null

通过将这些条件移入join on 子句来解决这个问题:

SELECT e.code, e.inflation_rate, e.unemployment_rate, c.gov_form
FROM economies AS e
LEFT JOIN countries AS c
   ON c.code = e.code
   AND c.gov_form <> 'Constitutional Monarchy'
   AND c.gov_form NOT LIKE '%Republic%'
WHERE e.year = 2015
ORDER BY e.inflation_rate;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2015-12-21
    • 2013-12-16
    • 2011-09-21
    • 2013-08-22
    • 2021-02-17
    相关资源
    最近更新 更多