我有两张表emp_master和transfer。为每个employee_id 在emp_master中,转移表中可以有多个条目。我想得到最新消息 基于date_of_tansfer从传输表中记录并使用来自的数据显示它 emp_master。我写了一个这样的查询,但是没有用。我收到了一个错误 “EMP.EMPLOYEE_ID:无效标识符”。如果我硬编码,我可以获得单个员工的详细信息 它与employee_id ..但我如何修改它以获取所有员工的数据..
select distinct emp.employee_id,trnsf.OU
from emp_master emp
left join (select * from (select * from transfer where employee_id = emp.employee_id
and date_of_transfer <= SYSDATE order by date_of_transfer desc) where rownum = 1) trnsfr
on trnsfr.EMPLOYEE_ID = emp.employee_id
CREATE TABLE "EMP_MASTER"
( "EMPLOYEE_ID" NUMBER(10,0),
"FIRST_NAME" VARCHAR2(30 BYTE),
"MIDDLE_NAME" VARCHAR2(30 BYTE),
"SURNAME" VARCHAR2(30 BYTE),
)
CREATE TABLE "TRANSFER"
( "EMPLOYEE_SR_NO" NUMBER,
"EMPLOYEE_ID" NUMBER(10,0),
"DATE_OF_TRANSFER" DATE,
"OU" VARCHAR2(30 BYTE)
)
答案 0 :(得分:1)
您获得该错误的原因是派生表(子查询)的嵌套级别。子查询只能“看到”直接“父”查询中的列/表(在您的情况下是将结果限制为一行的外部选择)。
以下应该做你想做的事:
select distinct emp.employee_id, trnsfr.ou
from emp_master emp
left join (
select transfer.employee_id,
transfer.ou,
row_number() over (order by date_of_transfer desc) as rn
from transfer
where date_of_transfer <= SYSDATE
) trnsfr
on trnsfr.employee_id = emp.employee_id and trnsfr.rn = 1;
如果date_of_transfer
确实是一个“DATE”(即没有涉及时间),那么您可能会考虑使用date_of_transfer <= trunc(SYSDATE)
代替“删除”SYSDATE结果的时间。
答案 1 :(得分:0)
请使用内部联接和子查询尝试此查询:
SELECT * FROM EMP_MASTER T1
INNER JOIN TRANSFER T2 ON T1.employee_id =T2.employee_id
WHERE T2.DATE_OF_TRANSFER=(SELECT MAX(T3.DATE_OF_TRANSFER) FROM TRANSFER T3 WHERE T3.employee_id =T2.employee_id );