0

我有两个表 emp_master 和 transfer。对于emp_master 中的每个employee_id,传输表中可以有多个条目。我想根据 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)
 ) 
4

2 回答 2

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_of_transfer <= trunc(SYSDATE)它来“删除”来自 SYSDATE 结果的时间。

于 2012-07-04T06:38:17.377 回答
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 );
于 2012-07-04T06:56:07.703 回答