2

私は3つのテーブルを持っています。

  1. シートテーブル
  2. 現地従業員
  3. 外国人社員。

Seat と Local の間には、どの人がどの座席に座っているかを示す person_id という共通の列が 1 つあります。

同じように Seat と Foreign テーブルの間、person_id も。

左外部結合を使用して、Seat と Local ... と Seat と Foreign の間で必要なデータを取得できます。空席の null 席と占有席の personid を取得します。

私の質問は、両方のテーブルを含む単一のクエリ マッピング シート テーブルを取得して、統合レポートを取得することはできますか?

現在使用しているクエリは次のとおりです。

select seat.apeh05_person_id_k
      ,seat.apeh18_seat_r seatNo
      , seat.apeh17_floor_k  seatFloor
      ,vendor.apeh15_cds_d cdsid
      , vendor.apeh15_first_n firstname
      , vendor.apeh15_last_n lastname
      ,vendor.apeh15_supervisor_cds_d ll6cdsid
      ,vendor.apeh15_ll5_cds_d ll5cdsid
      , vendor.apeh15_ll4_cds_d ll4cdsid 
 from iapeh18_seat seat ,
       IAPEH15_VENDOR_EMPLOYEE  vendor
 where seat.apeh05_person_id_k = vendor.apeh15_vendor_employee_k (+) 
 order by   seat.apeh05_person_id_k asc

他のクエリは次のとおりです。

select seat.apeh05_person_id_k
      ,seat.apeh18_seat_r seatNo
      , seat.apeh17_floor_k  seatFloor
      ,local.apeh09_cds_d cdsid
      ,local.apeh09_first_n firstname
      , local.apeh09_last_n lastname
      ,local.apeh09_supervisor_cds_d ll6cdsid
      ,local.apeh09_ll5_cds_d ll5cdsid
      ,  local.apeh09_ll4_cds_d ll4cdsid 
 from iapeh18_seat seat 
        , IAPEH09_LOCAL_EMPLOYEE local
 where seat.apeh05_person_id_k = local.apeh05_candidate_k (+)
 order by seat.apeh05_person_id_k asc
4

3 に答える 3

3

おそらくレムコ・ヤンセンの答えのより効果的なバージョン

select seat.apeh05_person_id_k person_id
      ,seat.apeh18_seat_r seatNo
      ,seat.apeh17_floor_k  seatFloor
      ,employee.apeh15_cds_d cdsid
      ,employee.apeh15_first_n firstname
      ,employee.apeh15_last_n lastname
      ,employee.apeh15_supervisor_cds_d ll6cdsid
      ,employee.apeh15_ll5_cds_d ll5cdsid
      ,employee.apeh15_ll4_cds_d ll4cdsid 
  from iapeh18_seat seat ,
    (select * from IAPEH15_VENDOR_EMPLOYEE  
      union all
     select * from IAPEH09_LOCAL_EMPLOYEE
    ) employee
   where seat.apeh05_person_id_k = employee.apeh05_candidate_k (+)
   order by apeh05_person_id_k

最初に結合し、その後に結合します-個別の行を実行する手間を省きます(非常に高価な操作)。

于 2012-12-19T12:36:18.650 に答える
1

このようにできますが、これがあなたの望むものかどうかはわかりません。ローカルとベンダーの両方に apeh05_person_id_k の ID を持つ人物がいる場合、どうしたいですか?

また、seat.apeh05_person_id_k には両方のテーブルの ID を含めることができるため、通常は外部キー制約が必要になりますが、これは現在では不可能です。

全体として、これはあなたが求めたものだと思いますが、あなたのデザインには欠陥があると思います.

select 
  seat.*, -- Omitted field list for readability
  nvl2(local.apeh05_candidate_k, local.WhateverField, vendor.WhateverField) as WhateverField,
  nvl2(local.apeh05_candidate_k, local.YetAnotherField, vendor.YetAnotherField) as YetAnotherField
from 
  iapeh18_seat seat
  LEFT JOIN IAPEH15_VENDOR_EMPLOYEE vendor
    ON seat.apeh05_person_id_k = vendor.apeh15_vendor_employee_k
  LEFT JOIN IAPEH09_LOCAL_EMPLOYEE local
    ON seat.apeh05_person_id_k = local.apeh05_candidate_k
order by   
  seat.apeh05_person_id_k asc
于 2012-12-19T12:08:06.540 に答える
1

両方のクエリにはまったく同じ列が含まれているため、次のように UNION ステートメントでそれらをマージできます。

select seat.apeh05_person_id_k person_id
      ,seat.apeh18_seat_r seatNo
      ,seat.apeh17_floor_k  seatFloor
      ,vendor.apeh15_cds_d cdsid
      ,vendor.apeh15_first_n firstname
      ,vendor.apeh15_last_n lastname
      ,vendor.apeh15_supervisor_cds_d ll6cdsid
      ,vendor.apeh15_ll5_cds_d ll5cdsid
      ,vendor.apeh15_ll4_cds_d ll4cdsid 
  from iapeh18_seat seat ,
       IAPEH15_VENDOR_EMPLOYEE  vendor
 where seat.apeh05_person_id_k = vendor.apeh15_vendor_employee_k (+) 
UNION
select seat.apeh05_person_id_k person_id
      ,seat.apeh18_seat_r seatNo
      ,seat.apeh17_floor_k  seatFloor
      ,local.apeh09_cds_d cdsid
      ,local.apeh09_first_n firstname
      ,local.apeh09_last_n lastname
      ,local.apeh09_supervisor_cds_d ll6cdsid
      ,local.apeh09_ll5_cds_d ll5cdsid
      , local.apeh09_ll4_cds_d ll4cdsid 
 from iapeh18_seat seat 
        , IAPEH09_LOCAL_EMPLOYEE local
 where seat.apeh05_person_id_k = local.apeh05_candidate_k (+)
 order by person_id

UNION 演算子は、いずれかの結果に現れるすべての個別の行を返します。参照: UNION [ALL]、INTERSECT、MINUS 演算子

于 2012-12-19T12:17:54.917 に答える