从 Subquery 和 JOIN 中获得不同的结果,这似乎是相同的

Getting different results from Subquery and JOIN which seem to be the same

我正在 DataCamp 上做一道挑战题。它使用两个 tables,包含国家代码经济信息的“economies”和包含国家代码一般国家信息的“countries”。

挑战是:从“经济体”table 中获取 2015 年的国家代码、inflation 率和失业率,其中 gov_form 不是 'Constitutional Monarchy'或“国家/地区”中的“%Republic%”table。

使用 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 版本似乎排除了“国家”table 中不存在的国家(它们只存在于“经济体”table),例如 ROU(罗马尼亚) .但是,我认为左侧带有“经济”的 LEFT JOIN 将包括 table 中的所有行,并且无论它们是否存在于右侧 table?

都不会删除它们

如有任何建议,我们将不胜感激。

在第一个查询中,您通过在联接的 table 字段上设置条件来破坏 left join 的效果。例如c.gov_form <> 'Constitutional Monarchy'当没有country条记录满足join条件时,就会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;