Oracle 在左联接中使用嵌套查询

Oracle 在左联接中使用嵌套查询,oracle,left-join,Oracle,Left Join,我有两张桌子emp_master和transfer。每个员工的身份证 在emp_master中,传输表中可以有多个条目。我想知道最新的消息 根据传输日期从传输表中记录,并使用来自的数据显示 emp_大师。我写了一个这样的查询,但它不起作用。我犯了一个错误 EMP.EMPLOYEE_ID:无效标识符。如果我使用硬编码,我可以获得单个员工的详细信息 它与该员工的id一致。。但是我如何修改它以获取所有员工的数据呢 select distinct emp.employee_id,trnsf.OU fro

我有两张桌子emp_master和transfer。每个员工的身份证 在emp_master中,传输表中可以有多个条目。我想知道最新的消息 根据传输日期从传输表中记录,并使用来自的数据显示 emp_大师。我写了一个这样的查询,但它不起作用。我犯了一个错误 EMP.EMPLOYEE_ID:无效标识符。如果我使用硬编码,我可以获得单个员工的详细信息 它与该员工的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)
 ) 

出现该错误的原因是派生表子查询的嵌套级别。子查询只能看到直接父查询中的列/表,在您的情况下,直接父查询是将结果限制为一行的外部选择

以下操作应满足您的要求:

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;

如果传输的日期是一个日期,即不涉及时间,则可以考虑使用DyeTyOfTyPrase

。请尝试使用内部联接和子查询:< /P>查询。

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

我试过了…但是我从关键字not found select*、从hris_transfer_dtl中按日期描述的订单上的行号(其中employee_id=emp.employee_id和日期)中得到了一个错误,上面的错误是因为..我添加了别名。我让它工作了……但是对于整个查询,我得到了相同的错误emp.Employee\u id无效标识符。@Jasim:我修复了错误。*缺少前缀,where employee_id=emp.employee_id是不必要的,因为这是连接条件的一部分。我尝试了…查询现在没有抛出任何错误…但是我获取的数据不正确,因为列OU的大多数记录值都为空。.只有一行是正确的。@Jasim:是的在使用外部联接时预期的。您确定emp_MASTER中的每个员工id至少有一行吗?如果传输表中没有记录,则此查询不起作用…如果没有数据,我想填充null…请尝试以下操作:选择*从emp_MASTER T1左加入T1上的传输T2。员工id=T2.employee_id其中NVLT2.DATE_OF_传输,SYSDATE=NVL选择MAXT3.DATE\U OF_TRANSFER FROM TRANSFER T3,其中T3.employee\u id=T2.employee\u id,SYSDATE;