2014-09-26 17 views
6

Ho una tabella denominata items come segue:modo migliore per condizione di preferenza sql

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

Sopra le righe con oId=0 specifica i valori di default di elementi.
Ho bisogno di selezionare tutti key, value di un elemento con una particolare oId che includerà il difetto (OID = 0), se uno specifico key e value per tale oId non esiste.

Ad es. Per la voce 2, deve restituire

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

ho scritto la seguente query:

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 

C'è un modo per ottimizzare la query di cui sopra?

risposta

1

È possibile utilizzare JOIN sull'indice destro:

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

Vostri criteri è 2 volte più veloce ... grazie. –

Problemi correlati