[英]How would you do this SQL query?
假设我在MySQL表中有3个表,其中包含以下字段。
product_id
product_name
category_id
category_name
product_in_category_id
product_id
category_id
您建议使用哪种查询来获取“ product_in_category”表中当前尚未分配给某个类别的所有产品的列表?
性能非常重要,这些表非常庞大。
select a.* from product a
left join product_in_category b on a.product_id = b.product_id
where b.product_id is null
SELECT p.*
FROM PRODUCT p
LEFT JOIN PRODUCT_IN_CATEGORY pic ON pic.product_id = p.product_id
WHERE pic.product_in_category_id IS NULL
SELECT p.*
FROM PRODUCT p
WHERE p.product_id NOT IN (SELECT pic.product_id
FROM PRODUCT_IN_CATEGORY pic)
SELECT p.*
FROM PRODUCT p
WHERE NOT EXISTS (SELECT NULL
FROM PRODUCT_IN_CATEGORY pic
WHERE pic.product_id = p.product_id)
这取决于所比较的列是否可为空(值可以为NULL)。 如果它们可以为空,则NOT IN / NOT EXISTS更为有效 。 如果列不可为空,则LEFT JOIN / IS NULL更有效(仅MySQL) 。
我会使用左联接。
如果环顾四周,您会找到不包含在内且不存在的答案。
SELECT
p.product_id,
product_name
FROM
product p
left join product_in_category pc
on p.product_id = pc.product_id
WHERE
pc.product_id is null
基本上有三种方法可以做到这一点:
SELECT p.*
FROM product p
LEFT JOIN
product_in_category pc
ON pc.product_id = pc.product_id
WHERE pc.product_id IS NULL
要么
SELECT p.*
FROM product p
WHERE product_id NOT IN
(
SELECT product_id
FROM product_in_category
)
要么
SELECT p.*
FROM product p
WHERE NOT EXISTS
(
SELECT NULL
FROM product_in_category pc
WHERE pc.product_id = p.product_id
)
只要为product_in_category.product_id
编制索引,它们都很好,但是LEFT JOIN
和NOT IN
效率更高。
有关性能比较,请参见本文:
SELECT product_id
from products p
where not exists (select 1
from product_in_category pc
where pc.product_id = p.product_id)
SELECT Product_name from Product
WHERE ProductID not in (SELECT product_id FROM product_in_category)
独占联接始终是性能方面的难题。 这是一个可能有助于mysql独占连接的链接:
http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/
高温超导
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.