2013-01-09 28 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