我有一个Products表和一个Orders表定义,我可以按以下方式执行JOIN查询,以返回特定用户零订单的产品。
此查询有效,但速度非常慢。
select * from products where id not in (select product_id from orders where user_id = 1)
问题是,如何以更好的方式更快地编写相同的查询?
答案 0 :(得分:1)
您应该可以执行简单的LEFT JOIN
SELET * FROM products
LEFT JOIN orders ON (orders.product_id=products.id and orders.user_id=1)
WHERE orders.id IS NULL;
答案 1 :(得分:1)
不需要子查询:
SELECT p.product_id
FROM
Products p
LEFT JOIN Order o ON p.product_id = o.product_id AND o.user_id = @UserId
WHERE
o.order_id IS NULL -- or any other field that cannot be null on Order
编辑:为了提高性能,您可能还需要检查订单user_id列和您的ID上是否有索引(更有可能在那里有它们,可能还有聚簇索引,都值得检查)
答案 2 :(得分:0)
SELECT P.*
FROM products P
LEFT JOIN (SELECT product_id from orders where user_id = 1) O
ON P.id = O.product_id
WHERE O.product_id IS NULL