在左连接中使用嵌套查询

时间:2012-07-04 06:30:58

标签: oracle left-join

我有两张表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)
 ) 

2 个答案:

答案 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 );