2012-02-22 56 views
1

我正在使用產品使用三列鍵的遺留數據庫。我想選擇狀態爲「A」或在第二個表中具有匹配記錄的所有產品。如果它是一個單一列主鍵(如「ID」),我會做這種方式:如何基於多個列鍵進行子選擇

SELECT * FROM `product` 
WHERE `status` = 'A' 
     OR `id` IN (SELECT `foreign_key` FROM `table2`) 

我無法弄清楚如何做IN子句的子查詢中有三個按鍵雖然。我想我可以將鍵連接在一起並比較字符串,但這看起來非常低效。有沒有辦法做到這一點沒有連接?

+0

你可以使用'EXISTS(相關子查詢)' – wildplasser 2012-02-22 14:16:01

回答

2

可以LEFT JOIN表產品和表2的組合鍵,然後status = 'A' 或table2id IS NOT NULL

左[外]連接可以比同等的子查詢更快,因爲服務器可能能夠優化其更好

+0

+1是的,這是我的解決方案:) – 2012-02-22 14:21:27

+0

謝謝!它工作得很好。 – 2012-02-22 14:40:14

0

你可以使用UNION:

SELECT * 
FROM 'product' 
WHERE 'status' = 'A' 
UNION 
SELECT * 
FROM 'product' 
     JOIN 'table2' 
     ON (product.id = table2.foreign_key 
     AND ...) 
1
SELECT * FROM product p1 
WHERE status = 'A' 
    OR EXISTS (SELECT * 
    FROM table2 t2 
    WHERE t2.id = p1.foreign_key 
    AND t2.other_key = p1.secret_key 
    ... 
    ); 
1

做左連接:)

SELECT p.* FROM product p 
LEFT JOIN table2 t2 on p.key1 = t2.key1 and p.key2 = t2.key2 and p.key3 = t2.key3 
WHERE status = 'A' OR t2.key1 IS NOT NULL