MS Access Full Outer Присоединиться, используя 2 поля? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть 2 таблицы, для которых я хочу выполнить полное внешнее соединение в MS Access.

Скажем, у меня есть Таблица A , которая выглядит следующим образом:

A.ID    |  A.Value  | A.DATE
--------+-----------+----------
  1     |     30    | 05/2018
  1     |     28    | 06/2018
  1     |     26    | 07/2018
  2     |     250   | 04/2018
  2     |     252   | 05/2018
  2     |     240   | 06/2018

И Таблица B , которая выглядит следующим образом:

B.ID    |  B.FCST   | B.OUTDATE
--------+-----------+-----------
  1     |     35    | 06/2018
  1     |     33    | 07/2018
  1     |     30    | 08/2018
  2     |     300   | 06/2018
  2     |     280   | 07/2018
  2     |     260   | 08/2018

И для этого мне нужно выполнить соединения и союзы:

 A.ID   |  A.Value  | A.DATE  |  B.FCST   | B.OUTDATE
--------+-----------+---------+-----------+------------
  1     |     30    | 05/2018 |     -     |     -
  1     |     28    | 06/2018 |     35    |   06/2018
  1     |     26    | 07/2018 |     33    |   07/2018
  1     |     -     |    -    |     30    |   08/2018
  2     |     250   | 04/2018 |     -     |     -
  2     |     252   | 05/2018 |     -     |     -
  2     |     240   | 06/2018 |     300   |   06/2018
  2     |     -     |    -    |     280   |   07/2018
  2     |     -     |    -    |     260   |   08/2018

Поэтому мне нужно выполнить внутреннее соединение с A.ID = B.ID и A.DATE = B.OUTDATEи затем каким-то образом получить «более ранние» данные из Table.A в «Sit on top» внутренних объединенных данных, а «более поздние» данные из Table.B сделать противоположное.Пока это моя попытка:

Select A.ID, A.Value, A.DATE, B.FCST, B.OUTDATE
FROM Table.A JOIN Table.B ON A.ID = B.ID AND A.DATE = B.OUTDATE

UNION ALL

Select A.ID, A.Value, A.DATE, B.FCST, B.OUTDATE
FROM Table.A LEFT JOIN Table.B ON A.ID = B.ID;
WHERE B.ID IS NULL

UNION ALL

Select A.ID, A.Value, A.DATE, B.FCST, B.OUTDATE
FROM Table.A RIGHT JOIN Table.B ON A.ID = B.ID
WHERE A.ID IS NULL

ORDER BY A.ID ASC;

Но я пропустил отметку, как кажется.Я получаю повторяющиеся строки, и это выглядит как внутреннее соединение.Я с удовольствием приму любой совет, чтобы помочь сделать это правильно.

1 Ответ

0 голосов
/ 29 ноября 2018

Я бы предложил объединение двух left joins, чтобы получить тот же результат, что и полный внешний, и, наконец, с легкой сортировкой, чтобы получить желаемый порядок:

select c.* from
(
    select a.id, a.value, a.date, b.fcst, b.outdate
    from a left join b on a.id = b.id and a.date = b.outdate
    union
    select b.id, a.value, a.date, b.fcst, b.outdate
    from b left join a on a.id = b.id and a.date = b.outdate
) c
order by c.id, nz(c.date, c.outdate)
...