2013-06-19 90 views
2

我沿着這些線路查詢:SQL,優化我的查詢:UNION VS OR

SELECT e.firstname, e.surname 
FROM employees e, cities c 
WHERE e.cityid = c.id 
UNION 
SELECT e.firstname, e.surname 
FROM employees e, cities c 
WHERE e.cityid = '' 
UNION 
SELECT e.firstname, e.surname 
FROM employees e, cities c 
WHERE e.cityid is null 

這工作完全正常,但我不喜歡,我不得不重複自己多次(3次,由2個聯合分隔)。

因此我試圖寫這樣的查詢:

SELECT e.firstname, e.surname 
FROM employees e, cities c 
WHERE (e.cityid = c.id OR e.cityid = '' OR e.cityid is null) 

它還工作完全正常,但相比與工會第一個查詢這是非常緩慢的。

所以有可能以另一種方式編寫查詢,所以我得到了第一個查詢的性能,而沒有多次重複自己。

謝謝。

+0

你索引了列嗎?你用什麼後端數據庫? – Roger

+0

'e.cityid =''':e.cityid是一個varchar或char鍵? – wildplasser

+6

爲什麼3個分支中的2個在表格之間沒有任何連接條件?這個查詢實際上應該做什麼? –

回答

1
SELECT e.firstname, e.surname 
FROM employees e left join cities c 
on e.cityid = c.id OR e.cityid = '' OR e.cityid is null 
+1

這不會讓所有員工都無法過濾嗎? –

+0

on e.cityid = c.id OR e.cityid =''OR e.cityid is null ..這是過濾條件 –

+1

但是通過將'e.cityid =''OR e.cityid爲空'放入'on'子句中,'left join'將保留'e'中既不符合該條件的行,也不保留'c'中的匹配行 –

2

這與原始查詢具有相同的語義。

SELECT DISTINCT e.firstname, 
       e.surname 
FROM employees e 
     LEFT JOIN cities c 
     ON e.cityid = c.id 
WHERE e.cityid = '' 
     OR e.cityid IS NULL 
     OR c.id IS NOT NULL