2012-08-08 32 views
1

我有以前的開發人員編寫的這個sql(下)。我怎樣才能將它分解成三個或四個部分,並再次將它們組合在一起而不是這個單一的大型SQL?請指教。我對sql很陌生,不知道如何簡化它。謝謝。我正在使用C#控制檯應用程序。如何分解這個很長的sql來簡化?

SELECT distinct 
    department_name CTG_DEPARTMENT, 
    chart_id SPC_CHART_ID, 
    concat(process_id, concat('-', item_name)) MONITOR_ITEM, 
    product_id CTG_PRODUCT, 
    graphtype SPC_GRAPH_TYPE, 
    CASE WHEN viorules LIKE '%9%' THEN 'OOS' 
     WHEN viorules LIKE '%10%' THEN 'OOS' 
     WHEN viorules IS NULL  THEN 'OK' 
           ELSE 'OOC' END SPC_STATUS, 
    process_stage, 
    'L8B' fab_name 
FROM 
(
    SELECT 
    'ARRAY' process_stage, 
    dept.item_name department_name, 
    dept.chart_id, 
    proc_id.item_name process_id, 
    item.item_name, 
    product.item_name product_id, 
    graphtype 
    FROM 
    (
    SELECT 
     item_name, 
     chart_id 
    FROM 
     aryspch.c_ctg_filter f, 
     aryspch.c_ctg_item i, 
     aryspch.c_ctg_relate r 
    WHERE 
     GROUP_ID = 6 
     AND filter_name IN ('Department') 
     AND f.filter_id = i.filter_id 
     AND i.item_id = r.item_id 
) dept 
    , 
    (
    SELECT 
     item_name, 
     chart_id 
    FROM 
     aryspch.c_ctg_filter f, 
     aryspch.c_ctg_item i, 
     aryspch.c_ctg_relate r 
    WHERE 
     GROUP_ID = 6 
     AND filter_name IN ('Process_ID')  
     AND f.filter_id = i.filter_id 
     AND i.item_id = r.item_id 
) proc_id 
    , 
    (
    SELECT 
     item_name, 
     chart_id 
    FROM 
     aryspch.c_ctg_filter f, 
     aryspch.c_ctg_item i, 
     aryspch.c_ctg_relate r 
    WHERE 
     GROUP_ID = 6 
     AND filter_name IN ('Item') 
     AND f.filter_id = i.filter_id 
     AND i.item_id = r.item_id 
) item 
    , 
    (
    SELECT 
     item_name, 
     chart_id 
    FROM 
     aryspch.c_ctg_filter f, 
     aryspch.c_ctg_item i, 
     aryspch.c_ctg_relate r 
    WHERE 
     GROUP_ID = 6 
     AND filter_name IN ('Product') 
     AND f.filter_id = i.filter_id 
     AND i.item_id = r.item_id 
) product 
    , 
    (
    SELECT DISTINCT 
     chartid, 
     graphtype 
    FROM 
     aryspch.spchis 
    WHERE 
     reporttime > SYSDATE - 2 
) a 
    WHERE 
     dept.chart_id = proc_id.chart_id 
    AND dept.chart_id = item.chart_id 
    AND dept.chart_id = product.chart_id 
    AND dept.chart_id = a.chartid 
) 
    spc 
LEFT JOIN 
(
    SELECT 
    viorules, 
    mtimestamp, 
    chartid 
    FROM 
    aryspch.oochis 
) 
    oochis 
    ON spc.chart_id = oochis.chartid 
    AND mtimestamp > SYSDATE - 2 
+6

查看我編輯的SQL佈局。雖然現在有更多的線條,但它是完全相同的代碼,並顯示了正在連接在一起的單個查詢。有沒有什麼特別的關於這個查詢,你不明白,是壞了,還是需要重構? – MatBailie 2012-08-08 10:19:09

回答

2

一種選擇是使用公用表表達式來定義每個子查詢,然後將這些指定查詢連接在一起。

WITH 
    dept AS 
(
    SELECT 
    item_name, 
    chart_id 
    FROM 
    aryspch.c_ctg_filter f, 
    aryspch.c_ctg_item i, 
    aryspch.c_ctg_relate r 
    WHERE 
    GROUP_ID = 6 
    AND filter_name IN ('Department') 
    AND f.filter_id = i.filter_id 
    AND i.item_id = r.item_id 
) 
, 
    proc_id AS 
(
    SELECT 
    item_name, 
    chart_id 
    FROM 
    aryspch.c_ctg_filter f, 
    aryspch.c_ctg_item i, 
    aryspch.c_ctg_relate r 
    WHERE 
    GROUP_ID = 6 
    AND filter_name IN ('Process_ID')  
    AND f.filter_id = i.filter_id 
    AND i.item_id = r.item_id 
) 
, 
    item AS 
(
    SELECT 
    item_name, 
    chart_id 
    FROM 
    aryspch.c_ctg_filter f, 
    aryspch.c_ctg_item i, 
    aryspch.c_ctg_relate r 
    WHERE 
    GROUP_ID = 6 
    AND filter_name IN ('Item') 
    AND f.filter_id = i.filter_id 
    AND i.item_id = r.item_id 
) 
, 
    product AS 
(
    SELECT 
    item_name, 
    chart_id 
    FROM 
    aryspch.c_ctg_filter f, 
    aryspch.c_ctg_item i, 
    aryspch.c_ctg_relate r 
    WHERE 
    GROUP_ID = 6 
    AND filter_name IN ('Product') 
    AND f.filter_id = i.filter_id 
    AND i.item_id = r.item_id 
) 
, 
    a AS 
(
    SELECT DISTINCT 
    chartid, 
    graphtype 
    FROM 
    aryspch.spchis 
    WHERE 
    reporttime > SYSDATE - 2 
) 
, 
    spc AS 
(
    SELECT 
    'ARRAY' process_stage, 
    dept.item_name department_name, 
    dept.chart_id, 
    proc_id.item_name process_id, 
    item.item_name, 
    product.item_name product_id, 
    graphtype 
    FROM 
    dept, 
    proc_id, 
    item, 
    product, 
    a 
    WHERE 
     dept.chart_id = proc_id.chart_id 
    AND dept.chart_id = item.chart_id 
    AND dept.chart_id = product.chart_id 
    AND dept.chart_id = a.chartid 
) 
, 
    oochis AS 
(
    SELECT 
    viorules, 
    mtimestamp, 
    chartid 
    FROM 
    aryspch.oochis 
) 

SELECT distinct 
    department_name CTG_DEPARTMENT, 
    chart_id SPC_CHART_ID, 
    concat(process_id, concat('-', item_name)) MONITOR_ITEM, 
    product_id CTG_PRODUCT, 
    graphtype SPC_GRAPH_TYPE, 
    CASE WHEN viorules LIKE '%9%' THEN 'OOS' 
     WHEN viorules LIKE '%10%' THEN 'OOS' 
     WHEN viorules IS NULL  THEN 'OK' 
           ELSE 'OOC' END SPC_STATUS, 
    process_stage, 
    'L8B' fab_name 
FROM 
    spc 
LEFT JOIN 
    oochis 
    ON spc.chart_id = oochis.chartid 
    AND mtimestamp > SYSDATE - 2