2013-01-09 30 views
1

可能重複:
Using an Alias in a WHERE clauseSQL ..別名在條件

請讓我知道爲什麼我不能夠使用的別名,其中條件查詢如下所示。

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你可以使用'case' ...這裏有一些其他的[相關文章](http://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause) – bonCodigo

+2

爲什麼不能使用'innerTable.NEW_VALUE_STRING <>'LOGGED_OUT''? (或者我剛剛讀錯了嗎?) – Popnoodles

回答

3

FROMs和JOINS以及WHERE中的所有東西用於生成所有t的東西他選擇。所以你不能在WHERE中使用SELECT的別名,因爲WHERE在邏輯上是先前的。呈現給SELECT的行在已經應用WHERE之後。

因此Status根本不知道WHERE。

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