Нужно полное внешнее соединение без перекрестного соединения - PullRequest
1 голос
/ 09 января 2020

Необходимо объединить две таблицы без перекрестного соединения между ними.

Условие соединения необходимо выполнить для Tabl.month = Tab2.month

Ввод

 Table1          Table2
 Month ID        Month ID
 1     a         1     a
 1     b         1     b
 1     c         2     g
 2     d         3     i
 2     e         3     j
 3     f         3     k

Вывод:

Month_Tab1  ID_Tab1   Month_Tab2   ID_Tab2
1           a         1            a
1           b         1            b
1           c         Null         Null
2           d         2            g
2           e         Null         Null
3           f         3            i
Null        Null      3            j
Null        Null      3            k

Вышеуказанное o / p требуется, без перекрестного соединения, пробовал полное внешнее соединение, но происходит перекрестное соединение, так как идентификатор дублируется в обеих таблицах. Соединение влево / вправо также не может быть применимо, поскольку любая из таблиц может иметь больший набор идентификаторов.

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Вы можете использовать полное внешнее соединение:

select
  a.month,
  a.id,
  b.month,
  b.id
from (
  select month, id,
    row_number() over(partition by month order by id) as n
  from table1
) a
full outer join (
  select month, id,
    row_number() over(partition by month order by id) as n
  from table2
) b on b.month = a.month and b.n = a.n
order by coalesce(a.month, b.month), coalesce(a.n, b.n)
0 голосов
/ 09 января 2020

Вы хотите full join, но с row_number() для определения совпадений:

select t1.month month_tab1, t1.id id_tab1, t2.month month_tab2, t2.id id_tab2
from (
    select t.*, row_number() over(partition by month order by id) rn from table1 t
) t1 
full join (
    select t.*, row_number() over(partition by month order by id) rn from table2 t) t2       
on t2.month = t1.month and t2.rn = t1.rn
...