SQL문인데 이해가 갈것같으면서도 안갑니다.. 답변부탁드립니다..ㅠㅠ 0 2 3,109

by 초슈꽃 sql [2013.09.24 18:56:33]



안녕하세요 ~
PROCEDURE CAPA_SELECT ( P_CURSOR   OUT  TYPES.TCURSOR
  , W_SOB_ID   IN   NUMBER
  , W_ORG_ID   IN   NUMBER
  , W_WORKCENTER_ID    IN   NUMBER
  , W_ENABLED_FLAG     IN   VARCHAR2  
  , W_NO_ENROLL_FLAG   IN   VARCHAR2   
  )
IS
  V_LOCAL_DATE   DATE := TRUNC(GET_LOCAL_DATE(W_SOB_ID));
BEGIN

   OPEN P_CURSOR FOR
   SELECT SSW.WORKCENTER_CODE
    , SSW.WORKCENTER_DESCRIPTION
    , WWC.MONTHLY_CAPA_MM
    , 'MM/Month'   AS CAPA_UOM
    , WWC.REMARK
    , WWC.EFFECTIVE_DATE_FR
    , WWC.EFFECTIVE_DATE_TO
    , WWC.ENABLED_FLAG
    , WWC.WORKCENTER_CAPA_ID
    , SSW.WORKCENTER_ID
FROM SDM_STANDARD_WORKCENTER  SSW
    , WIP_WORKCENTER_CAPA   WWC
    WHERE WWC.WORKCENTER_ID(+)  = SSW.WORKCENTER_ID
  AND SSW.SOB_ID     = W_SOB_ID
  AND SSW.ORG_ID     = W_ORG_ID
  AND ((W_WORKCENTER_ID IS NULL AND 1 = 1)
    OR (W_WORKCENTER_ID IS NOT NULL AND SSW.WORKCENTER_ID = W_WORKCENTER_ID))
  AND ((W_ENABLED_FLAG   = 'N' AND 1 = 1)
    OR (W_ENABLED_FLAG   != 'N' AND (WWC.ENABLED_FLAG = 'Y'
   AND  WWC.EFFECTIVE_DATE_FR <= V_LOCAL_DATE
   AND  NVL(WWC.EFFECTIVE_DATE_TO, V_LOCAL_DATE) >= V_LOCAL_DATE)))
  AND ((W_NO_ENROLL_FLAG    != 'Y' AND 1 = 1)
    OR (W_NO_ENROLL_FLAG    = 'Y' AND
  NOT EXISTS
    ( SELECT 'X'
    FROM WIP_WORKCENTER_CAPA WC
   WHERE WC.WORKCENTER_ID    = SSW.WORKCENTER_ID
    )))
    ;
END CAPA_SELECT;

인데요 궁금한점은 where 절부터 입니다.
where 절에 아우터조인걸고 그다음 and에 sob, org 이건 그냥 패스하셔도 되는데
W_WORKCENTER_ID가 널값 에 트루 가  나오거나
또는 널값이 아니고 WORKCENTER_ID = W_WORKCENTER_ID 한다..???
또 그밑에 ENABLED FLAG 도 못알아듣기는 마찬가지.. 제가 왕초보라 그러는데 where절부터 차근차근 설명해 주실수있는 능력자분을 찾습니다.. ㅠㅠ

by 마농 [2013.09.25 08:10:07]

W_ 로 시작하는 변수들은 입력되는 조건값들이구요
이 조건값이 입력되면 조건값에 해당하는 자료를 가져오고
이 조건값이 입력되지 안으면 모든 자료를 가져오라는 구문입니다.
((W_WORKCENTER_ID IS NULL AND 1 = 1)
OR (W_WORKCENTER_ID IS NOT NULL AND SSW.WORKCENTER_ID = W_WORKCENTER_ID))
이 구문을 쪼개어 분석해 보면 OR 절에 의해
(W_WORKCENTER_ID IS NULL 조건값이 널인 경우) 와
(W_WORKCENTER_ID IS NOT NULL 조건값이 입력된 경우) 로 나누어 지고
각각에 대해
조건값이 없는 경우 (1 = 1 무조건 참인 조건, 즉 모든 자료 검색)
조건값이 있는 경우 (SSW.WORKCENTER_ID = W_WORKCENTER_ID 해당조건값을 검색)
이렇게 나뉘게 됩니다.
OR 절에 의해 조건값 유무에 따라 둘중 하나의 조건이 수행되게 됩니다.
하나만 이해하시면 나머지 조건들도 동일한 규칙으로 적용됩니다.

by 손님 [2013.09.25 10:20:12]
아 덕분에 많은 도움이 되었습니다 명쾌하네요 감사합니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입