выберите минимум из двух таблиц, используя левое соединение - PullRequest
3 голосов
/ 18 ноября 2011

Мне нужно выбрать минимум набора дат в двух таблицах, и мой SQL настолько ржавый, что я не могу думать ...

У меня есть таблица с некоторыми бизнес-объектами:

create table FOO (
  FOO_ID number(19, 0) not null,
  BAR varchar2(255),
  primary key (FOO_ID)
);

Для этого бизнес-объекта есть ноль или много дат:

create table A_DATES (
  FOO_ID number(19, 0) not null,
  A_DATE date not null,
  primary key (FOO_ID , A_DATE)
);

И есть другой набор дат ноль или много для того же бизнес-объекта:

create table B_DATES (
  FOO_ID number(19, 0) not null,
  B_DATE date not null,
  primary key (FOO_ID , B_DATE)
);

Таблица FOO содержит:

+------+--------+
|FOO_ID|A_STRING|
+------+--------+
|1     |aaa     |
|2     |bbb     |
|3     |ccc     |
+------+--------+

Таблица A_DATES содержит:

+------+-----------+
|FOO_ID|A_DATE     |
+------+-----------+
|1     |01-Jan-2001|
|1     |01-Jan-2002|
|2     |01-Jan-2003|
|2     |01-Jan-2004|
+------+-----------+

Таблица B_DATES содержит:

+------+-----------+
|FOO_ID|B_DATE     |
+------+-----------+
|1     |01-Jan-2003|
|1     |01-Jan-2004|
|2     |01-Jan-2001|
|2     |01-Jan-2002|
+------+-----------+

Мне нужнонаписать один выбор (, чтобы не было временных таблиц и т. д. ), который выбирает минимум каждого из наборов дат, если таковые имеются, для каждого FOO.Набор результатов должен выглядеть следующим образом:

+------+--------+-----------+
|FOO_ID|A_STRING|MY_DATE    |
+------+--------+-----------+
|1     |aaa     |01-Jan-2001|
|2     |bbb     |01-Jan-2001|
|3     |ccc     |<null>     |
+------+--------+-----------+

1 Ответ

4 голосов
/ 18 ноября 2011
select f.FOO_ID, f.A_STRING, min(d.dt) as 'MY_DATE'
from FOO f
left join (
  select FOO_ID, min(A_DATE) as dt from A_DATES group by FOO_ID
  union select FOO_ID, min(B_DATE) as dt from B_DATES group by FOO_ID
) d
  on f.FOO_ID = d.FOO_ID
group by
  f.FOO_ID, f.A_STRING
...