具有(来自)别名的SQL子查询

具有(来自)别名的SQL子查询,sql,oracle,subquery,alias,Sql,Oracle,Subquery,Alias,我需要有关select子句中的子查询的帮助。我有表格:员工(员工ID、员工姓名、员工组)和活动(活动日期、活动状态、员工ID)。我需要为“W”集团的员工选择一些活动 不幸的是,我不能使用CREATETABLE/VIEW函数,所以我尝试了这个,但它不起作用 SELECT DISTINCT TB1.EMPLOYEE_NAME, (SELECT TB1.ACTIVITY_DATE FROM TB1 WHERE TB1.ACTIVITY_STATUS = 'START' AND TB1.ACTIVI

我需要有关select子句中的子查询的帮助。我有表格:员工(员工ID、员工姓名、员工组)和活动(活动日期、活动状态、员工ID)。我需要为“W”集团的员工选择一些活动

不幸的是,我不能使用CREATETABLE/VIEW函数,所以我尝试了这个,但它不起作用

SELECT DISTINCT

TB1.EMPLOYEE_NAME,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'START' AND TB1.ACTIVITY_NUMBER = 1) AS FIRST_START,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'START' AND TB1.ACTIVITY_NUMBER = 2) AS SECOND_START,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'STOP' AND TB1.ACTIVITY_NUMBER = 1) AS FIRST_STOP,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'STOP' AND TB1.ACTIVITY_NUMBER = 2) AS SECOND_STOP

FROM( 

     SELECT DISTINCT

     A.EMPLOYEE_NAME,        
     B.ACTIVITY_DATE,
     B.ACTIVITY_STATUS,
     ROW_NUMBER() OVER (PARTITION BY A.EMPLOYEE_NAME,B.ACTIVITY_STATUS 
       ORDER BY B.ACTIVITY_DATE ASC) ACTIVITY_NUMBER

     FROM 
     (SELECT * FROM EMPLOYEES WHERE EMPLOYEE_GROUP ='W')  A

     LEFT JOIN ( SELECT * FROM ACTIVITIES  WHERE ACTIVITY_STATUS IN ('START','STOP','PAUSE') )B
      ON A.EMPLOYEE_ID = B.EMPLOYEE_ID

  ) TB1

您知道我可以使用哪些函数从带有别名的表中选择数据吗?

我不确定您的Oracle版本是否支持它,但您必须将TB1定义为CTE(通用表表达式):


或者,老式的方法是复制粘贴“TB1”每个实例的定义。(是的,真的,我们以前就是这样做的。)

您试过CTE(公共表表达式)吗?在Oracle文档中,公共表表达式称为子查询分解。至少这是我最后一次阅读Oracle文档。
WITH TB1 AS ( 

     SELECT DISTINCT

     A.EMPLOYEE_NAME,        
     B.ACTIVITY_DATE,
     B.ACTIVITY_STATUS,
     ROW_NUMBER() OVER (PARTITION BY A.EMPLOYEE_NAME,B.ACTIVITY_STATUS 
       ORDER BY B.ACTIVITY_DATE ASC) ACTIVITY_NUMBER

     FROM 
     (SELECT * FROM EMPLOYEES WHERE EMPLOYEE_GROUP ='W')  A

     LEFT JOIN ( SELECT * FROM ACTIVITIES  WHERE ACTIVITY_STATUS IN ('START','STOP','PAUSE') )B
      ON A.EMPLOYEE_ID = B.EMPLOYEE_ID

  )
SELECT DISTINCT

TB1.EMPLOYEE_NAME,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'START' AND TB1.ACTIVITY_NUMBER = 1) AS FIRST_START,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'START' AND TB1.ACTIVITY_NUMBER = 2) AS SECOND_START,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'STOP' AND TB1.ACTIVITY_NUMBER = 1) AS FIRST_STOP,
(SELECT TB1.ACTIVITY_DATE FROM TB1 
WHERE TB1.ACTIVITY_STATUS = 'STOP' AND TB1.ACTIVITY_NUMBER = 2) AS SECOND_STOP

FROM TB1