0
SELECT DISTINCT group_id
       , supplier_id
       , supplier_name
       , site_division_id
       , site_division_name 
FROM view_supplier_site 
WHERE supplier_id IN (SELECT DISTINCT supplier_id 
                      FROM view_supplier 
                      WHERE YEAR IN (2008, 2009) 
                      AND received_quantity > 0 
                      AND COE_SUPPLIER NOT IN ('X - LG', 'Y - LG', 'Z - LG') ) 
4

2 回答 2

4

非子查询分解:

  SELECT vss.group_id, 
         vss.supplier_id, 
         vss.supplier_name, 
         vss.site_division_id, 
         vss.site_division_name 
    FROM view_supplier_site vss
    JOIN (SELECT vs.supplier_id
            FROM view_supplier vs
           WHERE vs.year IN (2008, 2009)  
             AND vs.received_quantity > 0 
             AND vs.coe_supplier NOT IN ('X - LG', 'Y - LG', 'Z - LG')
        GROUP BY vs.supplier_id) s ON s.supplier_id = vss.supplier_id
GROUP BY vss.group_id, vss.supplier_id, vss.supplier_name, vss.site_division_id, vss.site_division_name 

使用子查询分解:

WITH suppliers AS (
    SELECT vs.supplier_id
      FROM view_supplier vs
     WHERE vs.year IN (2008, 2009)  
       AND vs.received_quantity > 0 
       AND vs.coe_supplier NOT IN ('X - LG', 'Y - LG', 'Z - LG')
  GROUP BY vs.supplier_id)
  SELECT vss.group_id, 
         vss.supplier_id, 
         vss.supplier_name, 
         vss.site_division_id, 
         vss.site_division_name 
    FROM view_supplier_site vss
    JOIN suppliers s ON s.supplier_id = vss.supplier_id
GROUP BY vss.group_id, vss.supplier_id, vss.supplier_name, vss.site_division_id, vss.site_division_name 

它们是等价的。

据我所知,没有太多的优化。接下来要看的是索引...

于 2009-10-28T05:30:49.283 回答
1

我建议如下:

  • 不要使用IN,而是使用内部连接(可能不是性能改进,但语句看起来“更好”)
  • 这将使您摆脱DISTINCTon view_supplier (同样,可能没有性能差异)
  • 是否需要 view_supplier 上的 DISTINCT?有一些 id 可能是供应商站点的键。
  • NOT IN可能是性能问题..你能把它改成其他类似的东西<'X - LG'吗?
  • 如果视图不仅仅是基表/列的“别名”,则可能有使用基础表的方法。
  • 另一件要考虑的事情是索引。
  • YEAR 是计算列吗?如果只是YEAR(datevalue)使用类似的东西可能会更快datevalue between <Jan1st> and <Dec31>

这些变化中的大部分都是表面性的,重点关注的领域将取决于您在声明中看到的问题。

于 2009-10-28T05:33:22.823 回答