从 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;
我正在 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;