2012-03-13 33 views
0

嗨,伙计们我有以下查询,但工会使它非常沉重,所以任何人都可以帮助修复我的查询。 有3种情况。一个项目的 1. pack_no =包(内部packitem) 2.项=项内部包(内部packitem) 3.项=不具有包(内部item_master)可以使用建议让我的查询更智能

SELECT DISTINCT item, loc FROM 
(SELECT e.pack_no item, g.store loc 
FROM dc_store_ranging a 
JOIN store g 
    ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND 
     g.store_close_date >= SYSDATE 
LEFT JOIN dc_pim_export_vert b 
     ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V') 
LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac 
JOIN item_master d 
    ON (b.item = d.item OR c.item = d.item) AND d.status = 'A' 
LEFT JOIN packitem e 
    ON (b.item = e.pack_no or c.item = e.pack_no) AND d.item = e.pack_no 
WHERE d.item NOT IN 
     (SELECT f.item 
     FROM item_attributes f 
     WHERE f.sh_store_order_unit = 'N' AND f.sh_trade_unit = 'Y') 
UNION 
SELECT e.item, g.store loc 
FROM dc_store_ranging a 
JOIN store g 
    ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND 
     g.store_close_date >= SYSDATE 
LEFT JOIN dc_pim_export_vert b 
     ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V') 
LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac 
JOIN item_master d 
    ON (b.item = d.item OR c.item = d.item) AND d.status = 'A' 
LEFT JOIN packitem e 
     ON (b.item = e.pack_no or c.item = e.pack_no) 
WHERE e.item NOT IN 
     (SELECT f.item 
     FROM item_attributes f 
     WHERE f.sh_store_order_unit = 'N' AND f.sh_trade_unit = 'Y') 
UNION 
SELECT d.item, g.store loc 
FROM dc_store_ranging a 
JOIN store g 
    ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND 
     g.store_close_date >= SYSDATE 
LEFT JOIN dc_pim_export_vert b 
     ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V') 
LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac 
JOIN item_master d 
    ON (b.item = d.item OR c.item = d.item) AND d.status = 'A' 
WHERE d.item NOT IN 
     (SELECT f.item 
     FROM item_attributes f 
     WHERE f.sh_store_order_unit = 'N' and f.sh_trade_unit = 'Y') 
); 
+3

如果你希望人们把时间花在你的问题,你应该多放一点精力在里面。例如,你的表结构是什么? – 2012-03-13 09:04:56

+1

变得沉重吗?这是什么意思? – emaillenin 2012-03-13 09:05:16

+0

我的眼睛从这个查询的可怕格式中流血。 – 2012-03-13 09:26:23

回答

2

到最简单的方法提高查询性能的方法是将UNION s更改为UNION ALL s - 这样,查询只需消除一次重复。

然而,应该可以简化这个查询:

WITH CTE AS 
(SELECT d.item d_item, e.item e_item, e.pack_no e_pack_no, g.store loc 
FROM dc_store_ranging a 
JOIN store g 
    ON g.store_name_secondary = CAST(a.loc AS VARCHAR2(150 BYTE)) AND 
     g.store_close_date >= SYSDATE 
LEFT JOIN dc_pim_export_vert b 
     ON a.dpac = b.dpac AND b.artikel_type_LMS NOT IN ('S','V') 
LEFT JOIN dc_ccn190_sid_vtb c ON a.dpac = c.dpac 
JOIN item_master d 
    ON (b.item = d.item OR c.item = d.item) AND d.status = 'A' 
LEFT JOIN packitem e 
     ON (b.item = e.pack_no or c.item = e.pack_no) 
) 
SELECT DISTINCT item, loc FROM 
(--SELECT e_pack_no item, loc FROM CTE WHERE d_item = e_pack_no UNION ALL -- this select is a subset of the third select 
SELECT e_item item, loc FROM CTE UNION ALL 
SELECT d_item item, loc FROM CTE) uc 
WHERE uc.item NOT IN 
     (SELECT f.item 
     FROM item_attributes f 
     WHERE f.sh_store_order_unit = 'N' and f.sh_trade_unit = 'Y') 
+0

谢谢,这些都是很好的提示 – Eve 2012-03-14 08:29:31