2012-07-04 50 views
0

我有兩個表emp_master和傳輸。對於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) 
) 

回答

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結果。

+0

我試了一下.... BU我得到FROM關鍵字錯誤未找到 SELECT *,ROW_NUMBER()OVER(ORDER由date_of_transfer desc)作爲rn從hris_transfer_dtl 其中employee_id = emp.employee_id和date_of_transfer <= SYSDATE ...此查詢本身給出了該錯誤... – Andromeda

+0

以上錯誤是因爲* ..我添加別名。*和我得到它工作....但整個查詢我得到相同的錯誤emp.Employee_id無效的標識符.. – Andromeda

+0

@Jasim:我修正了錯誤。沒有*的前綴,並且'employee_id = emp.employee_id'不是必需的,因爲無論如何它都是連接條件的一部分。 –

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

這個查詢是nopt工作的情況下,如果在轉移表中沒有記錄...我想填充null incase沒有數據... – Andromeda

+0

請嘗試此操作:SELECT * FROM EMP_MASTER T1 LEFT JOIN TRANSFER T2 ON T1.employee_id = T2.employee_id WHERE NVL(T2.DATE_OF_TRANSFER,SYSDATE)= NVL((SELECT MAX(T3.DATE_OF_TRANSFER)FROM TRANSFER T3 WHERE T3.employee_id = T2.employee_id),SYSDATE); – TechDo