具有(来自)别名的SQL子查询
我需要有关select子句中的子查询的帮助。我有表格:员工(员工ID、员工姓名、员工组)和活动(活动日期、活动状态、员工ID)。我需要为“W”集团的员工选择一些活动 不幸的是,我不能使用CREATETABLE/VIEW函数,所以我尝试了这个,但它不起作用具有(来自)别名的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 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