0

SQL 连接多个表以在特定条件下存在记录

表 - A

PID 日期 COL-A COL-B
11 01-APR-13 AA BE
11 03-APR-13 DD BE
22 03-APR-13 EW BD
33 01-JUN-13 AR B7
11 20-APR-13 作为 AS

表 - B

PID 日期 COL-A COL-B
11 01-APR-13 在 BW
22 04-APR-13 AG BD
11 07-APR-13 AD BW
33 2013 年 5 月 8 日 AG BF

表-C

PID 日期 COL-A COL-B
11 01-APR-13 AG BR
22 02-APR-13 AR B3
33 03-APR-13 A3 由
44 01-APR-13 AB BY

查询 # 如果其中一个表的记录与 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
11 年 4 月 7 日 NYN

我知道我可以外部加入表格,但我想我可以如何扫描日期范围?我想我可以使用 level 并从 oracle 11g 连接来获取日期范围。

更新#我有几个表,我需要在这种性质下组合以获得每个表的相应 Y 和 N 值。话虽如此,我不确定Union是否是一个不错的选择。

4

1 回答 1

0

你不想要一个日期范围,你实际上想要一个你pid的 s 列表。如果你有 3 个表,我希望你有第四个“主”列表,所有这些都有外键。失败,您必须自己创建该列表。创建日期列表仅意味着您有很多日期缺少附加信息。

您的完整查询最终会看起来像这样:

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 回答