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') )
问问题
122 次
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
,而是使用内部连接(可能不是性能改进,但语句看起来“更好”) - 这将使您摆脱
DISTINCT
on view_supplier (同样,可能没有性能差异) - 是否需要 view_supplier 上的 DISTINCT?有一些 id 可能是供应商站点的键。
NOT IN
可能是性能问题..你能把它改成其他类似的东西<'X - LG'
吗?- 如果视图不仅仅是基表/列的“别名”,则可能有使用基础表的方法。
- 另一件要考虑的事情是索引。
- YEAR 是计算列吗?如果只是
YEAR(datevalue)
使用类似的东西可能会更快datevalue between <Jan1st> and <Dec31>
这些变化中的大部分都是表面性的,重点关注的领域将取决于您在声明中看到的问题。
于 2009-10-28T05:33:22.823 回答