如何根据多列键进行子选择

时间:2012-02-22 14:08:34

标签: mysql sql

我正在使用遗留数据库,该数据库使用三列密钥作为产品。我想选择状态为“A”或在第二个表中具有匹配记录的所有产品。如果它是单列主键(如'id'),我会这样做:

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

我无法弄清楚如何使用三个键进行IN子句子选择。我想我可以将键连接在一起并比较字符串,但这看起来非常低效。有没有办法在没有连接的情况下做到这一点?

4 个答案:

答案 0 :(得分:2)

您可以在复合键上LEFT JOIN table product和table2,然后status = 'A' OR table2.id IS NOT NULL

LEFT [OUTER] JOIN比同等子查询更快,因为服务器可能能够更好地优化它

答案 1 :(得分: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
     ...
     );

答案 2 :(得分: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

答案 3 :(得分:0)

您可以使用UNION:

SELECT * 
FROM   'product' 
WHERE  'status' = 'A'
UNION
SELECT * 
FROM   'product' 
       JOIN 'table2' 
       ON (product.id = table2.foreign_key 
       AND ...)