繁体   English   中英

您将如何执行此SQL查询?

[英]How would you do this SQL query?

假设我在MySQL表中有3个表,其中包含以下字段。

产品

product_id
product_name

类别

category_id
category_name

product_in_category

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

使用LEFT JOIN / 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

使用NOT IN

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 JOINNOT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM