0

特定の条件でのレコードの存在のための複数のテーブルでの SQL 結合

表 - A

PID 日付 COL-A COL-B
2013 年 4 月 11 日 AA BE
2013 年 4 月 11 日 DD BE
22 03-APR-13 EW BD
33 01-JUN-13 AR B7
11 2013 年 4 月 20 日 AS AS

表 - B

PID 日付 COL-A COL-B
11 01-APR-13 AT BW
22 04-APR-13 AG BD
11 07-APR-13 AD BW
33 08-MAY-13 AG BF

表 - C

PID 日付 COL-A COL-B
11 01-APR-13 AG ブラジル
22 02-APR-13 AR B3
33 03-APR-13 A3 BY
44 01-APR-13 AB BY

クエリ # レコードを含むテーブルは、少なくともテーブルの 1 つに、PID が (11,22) で、日付範囲が 01-APR-13 から 07-APR-13 の基準に一致するレコードがある場合、Y または N になります。

出力は次のようになります

PID 日付 表 - A 表 - B 表 - C
11 01-APR-13 YYY
22 02-APR-13 NNY
11 03-APR-13 YNN
22 03-APR-13 YNN
2013 年 4 月 11 日 NYN

テーブルを外部結合できることはわかっていますが、日付範囲をスキャンするにはどうすればよいでしょうか? level を使用して from oracle 11g で接続して、日付の範囲を取得できると思います。

更新 # 私は、これらのテーブルのそれぞれに対応する Y 値と N 値を取得するために、この性質で結合する必要があるいくつかのテーブルを持っています。そうは言っても、ユニオンが良い選択肢かどうかはわかりません。

4

1 に答える 1

0

日付の範囲は必要ありません。実際には、日付のリストが必要ですpid。これらのテーブルが 3 つある場合は、4 番目の「マスター」リストがあり、これらすべてに外部キーがあることを願っています。そのリストを自分で作成する必要があることに失敗しました。日付のリストを作成するということは、追加情報が欠落している日付がたくさんあるということです。

完全なクエリは次のようになります。

with pid_list as (
        -- Generate list of all PID/date combinations
 select pid, date
   from tablea
  union
 select pid, date
   from tableb
  union
 select pid, date
   from tablec
        )
select pl.pid, pl.date
     , case when a.pid is not null then 'Y' else 'N' end as tablea
     , case when b.pid is not null then 'Y' else 'N' end as tableb
     , case when c.pid is not null then 'Y' else 'N' end as tablec 
  from pid_list pl
  left outer join tablea a
    on pl.pid = a.pid
   and pl.date = a.date
  left outer join tableb b
    on pl.pid = b.pid
   and pl.date = b.date
  left outer join tablec
    on pl.pid = c.pid
   and pl.date = c.date
       -- Restrict date ranges from list of PIDs to that required
 where date between to_date('yyyymmdd', '20130401') 
                and to_date('yyyymmdd', '20130407')
       -- Enforce condition that PID must exist in one of the tables
   and exists ( select 1
                  from pid_list
                 where pid in (11, 22)
                   and date between to_date('yyyymmdd', '20130401')
                                and to_date('yyyymmdd', '20130407')
                       )

これは予約語であるため、実際の列名は DATE ではないと想定しています。

于 2013-04-27T22:36:59.553 に答える