我正在使用遗留数据库,该数据库使用三列密钥作为产品。我想选择状态为“A”或在第二个表中具有匹配记录的所有产品。如果它是单列主键(如'id'),我会这样做:
SELECT * FROM `product`
WHERE `status` = 'A'
OR `id` IN (SELECT `foreign_key` FROM `table2`)
我无法弄清楚如何使用三个键进行IN子句子选择。我想我可以将键连接在一起并比较字符串,但这看起来非常低效。有没有办法在没有连接的情况下做到这一点?
答案 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 ...)