2013-01-09 4 views
1

가능한 중복 : 제가의 별명을 사용할 수 아니에요 이유를 알려 주시기 바랍니다
Using an Alias in a WHERE clauseSQL .. 별칭 이름 WHERE 조건

경우 쿼리에 대한 조건 아래에 있습니다 ..에

SELECT * FROM (  
    SELECT USER_NAME AS "User ID", 
     OLD_VALUE_STRING as "Status", 
     NVL(lag(ENTRY_DATE) over (partition by user_name order by ENTRY_DATE), trunc(Sysdate-1)) as "Begin", 
      ENTRY_DATE as "End" 
     FROM (SELECT U.USER_NAME, 
       U.FULL_NAME, 
       UH.OLD_VALUE_STRING, 
       UH.NEW_VALUE_STRING, 
       UH.ENTRY_DATE, 
       US.IS_WORKING 
      FROM VIW.USER_HISTORY UH, VIW.USERS U, VIW.USER_STATUS US 
      WHERE U.ID = UH.USER_ID 
      AND UH.EVENT_ID = VIW.EVENT_PKG.GET_ID('UPD_USR_STATUS') 
      AND UH.NEW_VALUE_STRING = US.ABBREVIATION 
      AND UH.ENTRY_DATE >= TO_DATE('01082013', 'MMDDYYYY') 
      AND UH.ENTRY_DATE <= TO_DATE('01092013', 'MMDDYYYY') 
      ORDER BY U.USER_NAME, UH.ENTRY_DATE) 

    UNION   

    SELECT USER_NAME AS "User ID", 
     NEW_VALUE_STRING as "Status", 
     ENTRY_DATE AS "Begin", 
      lead(ENTRY_DATE) over (partition by user_name order by ENTRY_DATE) as "End" 
      FROM (SELECT U.USER_NAME, 
       U.FULL_NAME, 
       UH.OLD_VALUE_STRING, 
       UH.NEW_VALUE_STRING, 
       UH.ENTRY_DATE, 
       US.IS_WORKING 
      FROM VIW.USER_HISTORY UH, VIW.USERS U, VIW.USER_STATUS US 
      WHERE U.ID = UH.USER_ID 
      AND UH.EVENT_ID = VIW.EVENT_PKG.GET_ID('UPD_USR_STATUS') 
      AND UH.NEW_VALUE_STRING = US.ABBREVIATION 
      AND UH.ENTRY_DATE >= TO_DATE('01082013', 'MMDDYYYY') 
      AND UH.ENTRY_DATE <= TO_DATE('01092013', 'MMDDYYYY') 
      ORDER BY U.USER_NAME, UH.ENTRY_DATE)    
) as innerTable 
      WHERE Status <>'LOGGED_OUT'  
      ORDER BY 1,3 
+5

SQL이 할 수있는 것이 아니기 때문에 ... 문서를 읽으십시오. –

+0

+1 @ JordanKaye '사례'를 사용할 수 있습니다 ... 여기에서 다른 [관련 게시물] (http://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause) – bonCodigo

+2

'innerTable.NEW_VALUE_STRING <> 'LOGGED_OUT''을 사용할 수없는 이유는 무엇입니까? (아니면 그냥 잘못 읽었습니까?) – Popnoodles

답변

3

모든 물건 FROMs 조인 및 WHERE는 t에 대한 모든 물건을 생산하는 데 사용됩니다 그는 선택합니다. 따라서 WHERE가 논리적으로 앞서 있기 때문에 SELECT의 별칭을 WHERE에 사용할 수 없습니다. SELECT에 제공된 행은 WHERE가 이미 적용된 후에옵니다.

그래서 Status은 어디에도 전혀 알려지지 않았습니다.

1

해결책을 직접 찾았습니다. 그래도 감사합니다.

SELECT * FROM (  
    SELECT USER_NAME AS "User ID", 
     OLD_VALUE_STRING as "STATUS", 
     NVL(lag(ENTRY_DATE) over (partition by user_name order by ENTRY_DATE), trunc(Sysdate-1)) as "Begin", 
      ENTRY_DATE as "End" 
     FROM (SELECT U.USER_NAME, 
       U.FULL_NAME, 
       UH.OLD_VALUE_STRING, 
       UH.NEW_VALUE_STRING, 
       UH.ENTRY_DATE, 
       US.IS_WORKING 
      FROM VIW.USER_HISTORY UH, VIW.USERS U, VIW.USER_STATUS US 
      WHERE U.ID = UH.USER_ID 
      AND UH.EVENT_ID = VIW.EVENT_PKG.GET_ID('UPD_USR_STATUS') 
      AND UH.NEW_VALUE_STRING = US.ABBREVIATION 
      AND UH.ENTRY_DATE >= TO_DATE('01082013', 'MMDDYYYY') 
      AND UH.ENTRY_DATE <= TO_DATE('01092013', 'MMDDYYYY') 
      ORDER BY U.USER_NAME, UH.ENTRY_DATE) 

    UNION   

    SELECT USER_NAME AS "User ID", 
     NEW_VALUE_STRING as "STATUS", 
     ENTRY_DATE AS "Begin", 
      lead(ENTRY_DATE) over (partition by user_name order by ENTRY_DATE) as "End" 
      FROM (SELECT U.USER_NAME, 
       U.FULL_NAME, 
       UH.OLD_VALUE_STRING, 
       UH.NEW_VALUE_STRING, 
       UH.ENTRY_DATE, 
       US.IS_WORKING 
      FROM VIW.USER_HISTORY UH, VIW.USERS U, VIW.USER_STATUS US 
      WHERE U.ID = UH.USER_ID 
      AND UH.EVENT_ID = VIW.EVENT_PKG.GET_ID('UPD_USR_STATUS') 
      AND UH.NEW_VALUE_STRING = US.ABBREVIATION 
      AND UH.ENTRY_DATE >= TO_DATE('01082013', 'MMDDYYYY') 
      AND UH.ENTRY_DATE <= TO_DATE('01092013', 'MMDDYYYY') 
      ORDER BY U.USER_NAME, UH.ENTRY_DATE)    
) 
      WHERE STATUS <>'LOGGED_OUT'  
      ORDER BY 1,3