繁体   English   中英

将多个NOT IN转换为LEFT JOIN以提高性能

[英]Convert multiple NOT IN to LEFT JOIN to improve performance

我有此SQL查询,需要很长时间才能执行。

SELECT DISTINCT p.products_id, 
                p.products_group, 
                p.products_quantity, 
                p.products_length, 
                p.products_price, 
                p.products_height, 
                p.products_width, 
                p.products_weight, 
                p.products_cost, 
                p.products_rmb_cost, 
                p.products_best_rmb, 
                p.products_status, 
                p.products_image, 
                p.products_vendor_code, 
                p.products_date_added, 
                pd.products_name 
FROM   products p, 
       products_description pd 
WHERE  p.products_id = pd.products_id 
       AND p.products_id NOT IN(SELECT related_products_id 
                                FROM   products_related 
                                WHERE  products_id = '93667') 
       AND p.products_id NOT IN(SELECT products_id 
                                FROM   products_related 
                                WHERE  related_products_id = '93667') 
       AND p.products_group = '300' 
       AND language_id = 1 
       AND ( ( ( pd.products_name LIKE '%emerald%' ) 
                OR p.products_image LIKE '%emerald%' 
                OR p.products_id LIKE '%emerald%' ) 
             AND ( ( pd.products_name LIKE '%square%' ) 
                    OR p.products_image LIKE '%square%' 
                    OR p.products_id LIKE '%square%' ) ) 
       AND pd.products_id != '93667' 
ORDER  BY p.products_group, 
          p.products_quantity, 
          p.products_id 

我试图将2个NOT IN零件转换为LEFT JOIN,以提高性能,但是尽管性能确实得到了显着改善,但我得到的结果与原始查询并不相同。 关于如何正确修改此查询以使用LEFT JOIN代替NOT IN的任何建议?

编辑:

这是我尝试过的,但是得到错误的结果:

SELECT DISTINCT p.products_id, 
                p.products_group, 
                p.products_quantity, 
                p.products_length, 
                p.products_price, 
                p.products_height, 
                p.products_width, 
                p.products_weight, 
                p.products_cost, 
                p.products_rmb_cost, 
                p.products_best_rmb, 
                p.products_status, 
                p.products_image, 
                p.products_vendor_code, 
                p.products_date_added, 
                pd.products_name 
FROM   products p, 
       products_description pd 
       LEFT JOIN products_related pr 
              ON pr.products_id = '93667' 
                 AND pr.related_products_id = '93667' 
WHERE  p.products_id = pd.products_id 
       AND pr.products_id IS NULL 
       AND pr.related_products_id IS NULL 
       AND p.products_group = '300' 
       AND language_id = 1 
       AND ( ( ( pd.products_name LIKE '%emerald%' ) 
                OR p.products_image LIKE '%emerald%' 
                OR p.products_id LIKE '%emerald%' ) 
             AND ( ( pd.products_name LIKE '%square%' ) 
                    OR p.products_image LIKE '%square%' 
                    OR p.products_id LIKE '%square%' ) ) 
       AND pd.products_id != '93667' 
ORDER  BY p.products_group, 
          p.products_quantity, 
          p.products_id 

尝试在下面将转换后的查询左移

SELECT DISTINCT p.products_id, 
                p.products_group, 
                p.products_quantity, 
                p.products_length, 
                p.products_price, 
                p.products_height, 
                p.products_width, 
                p.products_weight, 
                p.products_cost, 
                p.products_rmb_cost, 
                p.products_best_rmb, 
                p.products_status, 
                p.products_image, 
                p.products_vendor_code, 
                p.products_date_added, 
                pd.products_name 
FROM   products p  
JOIN products_description pd ON p.products_id = pd.products_id 
LEFT JOIN products_related pr1 ON p.products_id=pr1.related_products_id AND pr1.products_id = '93667'
LEFT JOIN products_related pr2 ON p.products_id=pr2.products_id AND pr2.related_products_id = '93667'
WHERE  p.products_group = '300' 
       AND language_id = 1 
       AND ( ( ( pd.products_name LIKE '%emerald%' ) 
                OR p.products_image LIKE '%emerald%' 
                OR p.products_id LIKE '%emerald%' ) 
             AND ( ( pd.products_name LIKE '%square%' ) 
                    OR p.products_image LIKE '%square%' 
                    OR p.products_id LIKE '%square%' ) ) 
       AND pd.products_id != '93667' 
       AND pr1.related_products_id IS NULL 
       AND pr2.products_id IS NULL 
ORDER  BY p.products_group, 
          p.products_quantity, 
          p.products_id 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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