2014-09-26 45 views
6

更好的方式我有一個表命名items如下:到條件優先SQL

id oId key value 
1 0 color green 
2 0 size 30 
3 1 color red 
4 2 color blue 

以上行與oId=0指定項目的默認值。
我需要選擇所有keyvalue的項目與特定oId其中將包括默認(OID = 0),如果特定keyvalueoId不存在。

例如,就第2項,它應該返回

id oId key value 
1 0 size 30 
2 2 color blue 

我寫了下面的查詢:

SELECT * FROM items AS i 
WHERE i.oId=0 AND 
i.key NOT IN (SELECT key FROM items WHERE oId=2) 
UNION ALL 
SELECT * FROM items WHERE oId=2 

有沒有辦法來優化上面的查詢?

回答

1

您可以使用JOIN右側指數:

SELECT t1.`key`, IFNULL(t2.value, t1.value) 
FROM `items` AS t1 

LEFT JOIN `items` AS t2 
ON t1.`key` = t2.`key` AND t2.`oId` = 2 

WHERE t1.`oId` = 0; 

SQLFiddle

+0

您所查詢的是快2倍...謝謝。 – 2014-09-27 05:48:12