我在 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 將包括該表中的所有行,并且無論它們是否存在于右表中都不會洗掉它們?
任何建議表示贊賞。
uj5u.com熱心網友回復:
在第一個查詢中,您left join通過在連接表的欄位上放置條件來破壞 的效果。例如,當沒有滿足連接條件的記錄時c.gov_form <> 'Constitutional Monarchy'將為falsecountry,因為 then c.gov_formis 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419757.html
標籤:
