2013-07-24 10 views
1

쿼리에서 반환 된 결과 중 하나를 기반으로 첫 번째 필터에 표시된 하위 쿼리를 동적으로 만들려고 할 때 문제가 있습니다. 누군가 내가 잘못하고있는 것을 말해 줄 수 있습니까? 첫 번째 하위 쿼리에서는 작동했습니다.SQL의 하위 쿼리 하위 쿼리 - DB2

 (SELECT 
    MAX(MAX_DATE - MIN_DATE) AS NUM_CONS_DAYS 
    FROM 
    (
    SELECT 
     MIN(TMP.D_DAT_INDEX_DATE) AS MIN_DATE, 
     MAX(TMP.D_DAT_INDEX_DATE) AS MAX_DATE, 
     SUM(INDEX_COUNT)   AS SUM_INDEX 
    FROM 
     (
      SELECT 
       D_DAT_INDEX_DATE, 
       INDEX_COUNT, 
       D_DAT_INDEX_DATE - (DENSE_RANK() OVER(ORDER BY D_DAT_INDEX_DATE)) DAYS AS G 
      FROM 
       DWH.MQT_SUMMARY_WATER_READINGS 
      WHERE 
       N_COD_METER_CNTX_KEY = 79094 
     ) AS TMP 
    GROUP BY 
     TMP.G 
    ORDER BY 
     1 
)) AS MAX_NUM_CONS_DAYS 

은 위 내가 쿼리에서 CTXTKEY 또는 CTXT.N_COD_METER_CNTX_KEY로 123456을 대체하기 위해 노력하고있는 하위 쿼리입니다. 전체 코드는 다음과 같습니다. "MAX_NUM_CONS_DAYS"이전에 서브 쿼리에서보다 유의하십시오. 그러나 하나의 하위 쿼리 만있었습니다. 내가 얻고

SELECT 
    N_COD_WM_DWH_KEY, 
    V_COD_WM_SN_2, 
    N_COD_SP_ID, 
    CTXKEY, 
    V_COD_MIU_SN, 
    N_COD_POD, 
    MIU_CAT, 
    V_COD_SITR_ASSOCIATED, 
    WO_INST_DATE, 
    WO_MIU_CAT, 
    DAYSRECEIVED3, 
    MAX_NUM_CONS_DAYS, 
    (CASE WHEN (DAYSRECEIVED3 = 3) THEN 'Y' ELSE 'N' END) AS GREEN, 
    (CASE WHEN (DAYSRECEIVED3 < 3 AND DAYSRECEIVED3 > 0) THEN 'Y' ELSE 'N' END) AS BLUE, 
    (CASE WHEN (DAYSRECEIVED3 = 0 AND MAX_NUM_CONS_DAYS >= 5) THEN 'Y' ELSE 'N' END) AS ORANGE, 
    (CASE WHEN (DAYSRECEIVED3 = 0 AND MAX_NUM_CONS_DAYS BETWEEN 1 and 4) THEN 'Y' ELSE 'N' END) AS RED 

FROM 
(
SELECT 
    WMETER.N_COD_WM_DWH_KEY, 
    WMETER.V_COD_WM_SN_2, 
    WMETER.N_COD_SP_ID, 
    CTXT.N_COD_METER_CNTX_KEY AS CTXKEY, 
    CTXT.V_COD_MIU_SN, 
    CTXT.N_COD_POD, 
    MIU.N_COD_MIU_CATEGORY AS MIU_CAT, 
    CTXT.V_COD_SITR_ASSOCIATED, 
    T1.D_DAT_PLAN_INST AS WO_INST_DATE, 
    T1.N_COD_MIU_CATEGORY AS WO_MIU_CAT, 

    (SELECT COUNT(DISTINCT D_DAT_INDEX_DATE) FROM DWH.MQT_SUMMARY_WATER_READINGS WHERE (N_COD_METER_CNTX_KEY = CTXT.N_COD_METER_CNTX_KEY) AND D_DAT_INDEX_DATE BETWEEN ('2013-07-10') AND ('2013-07-12')) AS DAYSRECEIVED3, 

    (SELECT 
     MAX(MAX_DATE - MIN_DATE) AS NUM_CONS_DAYS 
     FROM 
     (
     SELECT 
      MIN(TMP.D_DAT_INDEX_DATE) AS MIN_DATE, 
      MAX(TMP.D_DAT_INDEX_DATE) AS MAX_DATE, 
      SUM(INDEX_COUNT)   AS SUM_INDEX 
     FROM 
      (
       SELECT 
        D_DAT_INDEX_DATE, 
        INDEX_COUNT, 
        D_DAT_INDEX_DATE - (DENSE_RANK() OVER(ORDER BY D_DAT_INDEX_DATE)) DAYS AS G 
       FROM 
        DWH.MQT_SUMMARY_WATER_READINGS 
       WHERE 
        N_COD_METER_CNTX_KEY = 79094 
      ) AS TMP 
     GROUP BY 
      TMP.G 
     ORDER BY 
      1 
    )) AS MAX_NUM_CONS_DAYS 



FROM DWH.DWH_WATER_METER AS WMETER 
LEFT JOIN DWH.DWH_WMETER_CONTEXT AS CTXT 
    ON WMETER.N_COD_WM_DWH_KEY = CTXT.N_COD_WM_DWH_KEY 
LEFT JOIN DWH.DWH_MIU AS MIU 
    ON CTXT.V_COD_MIU_SN = MIU.V_COD_MIU_SN 
LEFT JOIN 
    (SELECT V_COD_CORR_WAT_METER_SN, D_DAT_PLAN_INST, N_COD_MIU_CATEGORY 
     FROM DWH.DWH_ORDER_MANAGEMENT_FACT 
     JOIN DWH.DWH_MIU 
      ON DWH.DWH_ORDER_MANAGEMENT_FACT.V_COD_MIU_SN = DWH.DWH_MIU.V_COD_MIU_SN 
) AS T1 
    ON WMETER.V_COD_WM_SN_2 = T1.V_COD_CORR_WAT_METER_SN 
WHERE 
    (V_COD_SITR_ASSOCIATED = 'X') 
    AND ((MIU.N_COD_MIU_CATEGORY <> 4) OR ((MIU.N_COD_MIU_CATEGORY IS NULL) AND ((T1.N_COD_MIU_CATEGORY <> 4 ) OR (T1.N_COD_MIU_CATEGORY IS NULL )))) 
) 

오류는 다음과 같습니다

오류 코드 : -204, SQL 상태 : 42704

답변

-1

당신은, 부속 선택에 외부 선택에서보다 더 많은 열을 참조 할 수 없습니다 어쨌든 1 단계 깊이. 내가하는 일을 정확히 이해하면 바깥 쪽 선택에 DWH.MQT_SUMMARY_WATER_READINGSDWH.DWH_WMETER_CONTEXT을 가입해야 할 것입니다.

+0

감사합니다. mustaccio 하위 쿼리에서 참조하는 데 제한이 없습니다. – maldman

3

여기서 좋은 옵션은 CTE 또는 Common Table Expression을 사용하는 것입니다. 이것이 당신의 예에 국한되지 있지만,

WITH CTE_X AS(
SELECT VAL_A 
     ,VAL_B 
    FROM TABLE_A) 
,CTE_Y AS(
SELECT VAL_C 
     ,VAL_B 
    FROM TABLE_B) 
SELECT VAL_A 
     ,VAL_B 
    FROM CTE_X X 
    JOIN CTE_Y Y 
     ON X.VAL_A = Y.VAL_C; 

는 CTE의는 "메모리에"당신은 후속 쿼리에 액세스 할 수있는 테이블을 임시의 종류를 만들 것을 보여 않은 : 당신은 다음과 같은 일을 할 수 있습니다. 이렇게하면 내부 2 개의 subselect를 CTE로 발행 한 다음 "SELECT MAX (MAX_DATE - MIN_DATE) AS NUM_CONS_DAYS"쿼리에서 CTE를 사용할 수 있습니다.