0

emp_master と transfer の 2 つのテーブルがあります。emp_master の各 employee_id に対して、転送テーブルに複数のエントリが存在する可能性があります。date_of_tansfer に基づいて転送テーブルから最新のレコードを取得し、emp_master からのデータで表示したいと考えています。このようなクエリを作成しましたが、機能していません。「EMP.EMPLOYEE_ID: 無効な識別子」というエラーが表示されます。そのemployee_idでハードコードすると、1人の従業員の詳細を取得できます..しかし、すべての従業員のデータを取得するように変更するにはどうすればよいですか..

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

そのエラーが発生する理由は、派生テーブル (サブクエリ) のネスト レベルです。サブクエリは、直接の「親」クエリからの列/テーブルのみを「見る」ことができます(この場合、結果を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;

SYSDATE の結果から時間を「削除」するために代わりにdate_of_transfer使用することを検討するよりも、本当に「DATE」(つまり、時間がかからない) である場合。date_of_transfer <= trunc(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 に答える