我正在進行這個練習。
關于問題4,目標是找到在 "Jones "之后雇用的員工。我認為這個問題可以不通過連接來解決,就像這樣:
SELECT first_name, last_name, hire_date
FROM employees
WHERE hire_date > (
SELECT hire_date FROM employees WHERE Last_name = "Jones"
)
但網站上的答案表明:
SELECT e.first_name, e.last_name, e.hire_date
FROM employees e
JOIN employees davies
ON (davies.last_name = "Jones" )
WHERE davies.hire_date < e.hire_date。
這些或多或少都是一樣的,或者有什么理由認為第二個答案更好?
uj5u.com熱心網友回復:
我假設列last_name被定義為UNIQUE,所以第一個查詢中的子查詢只回傳1行。
如果不是這樣,那么這兩個查詢就不會回傳相同的結果,因為盡管第一個查詢中的子查詢可能會回傳超過1條記錄(在其他資料庫中,這個查詢甚至不會運行),SQLite將只選擇回傳的第一條記錄,并使用其hire_date與表中的所有記錄進行比較,而連接將使用last_name = "Jones"的所有記錄。
如果我的假設是正確的,那么這兩個查詢是等價的,但我建議使用第一個查詢,因為它更易讀,而且我相信它的性能會比連接更好。
如果我不得不為這個要求使用一個連接(因為它是家庭作業),我會選擇一個更可讀的形式:
SELECT e.first_name, e.last_name, e.hire_date
FROM employees e
JOIN (SELECT * FROM employees WHERE last_name = "Jones") t
ON t.hire_date < e.hire_date。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332717.html
標籤:
