Left Outer Join из «таблицы привязки», видя дубликаты - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь сделать полное соединение между 5 таблицами. Я пытаюсь сделать это с помощью «таблицы привязки», а затем выполнить левое внешнее соединение. Выберите все отдельные ключевые поля из каждой таблицы, а затем из тех, которые оставляют внешние объединения в каждой из 5 таблиц. Делать это с ВИЧ. Вот что у меня есть ...

select
COALESCE(a.key,b.key,c.key,d.key,e.key,NULL) key,
a.field_1,
b.field_2,
c.field_3,
d.field_4,
e.field_5
from (
    select distinct key from table_1
    union
    select distinct key from table_2
    union
    select distinct key from table_3
    union
    select distinct key from table_4
    union
    select distinct key from table_5
) as keyvalues
    LEFT OUTER JOIN table_1 as a on a.key = keyvalues.key
    LEFT OUTER JOIN table_2 as b on b.key = keyvalues.key
    LEFT OUTER JOIN table_3 as c on c.key = keyvalues.key
    LEFT OUTER JOIN table_4 as d on d.key = keyvalues.key
    LEFT OUTER JOIN table_5 as e on e.key = keyvalues.key

Приведенный выше код является общим, у меня есть намного больше полей, чем это, но это идея. То, что показывают мои результаты, является дубликатом ключевых значений. Это потому, что ключ не обязательно является первичным ключом в этих таблицах. Так что мой результат я бы хотел, чтобы не было дубликатов. Почти, если бы я мог взять отдельную переменную «keyvalues», прежде чем я начну выполнять эти левые внешние объединения.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Если вы предпочитаете объединения, то подзапросы с row_number сделают:

with 

table1 as (
select key, col1...coln
  from
      (select key, col1...coln,
              row_number() over(partition by key order by... ) rn
       from table_1)s
 where s.rn=1
),

table2 as (
select key, col1...coln
  from
      (select key, col1...coln,
              row_number() over(partition by key order by... ) rn
       from table_2)s
 where s.rn=1
),

table3 ... and so on ...

keyvalues as( --can use UNION ALL, because subqueries are already contain unique keys
select key from table1
union all 
select key from table2
union all
... and so on
)

select
COALESCE(a.key,b.key,c.key,d.key,e.key) key,
a.col1,
b.coln,
...
from keyvalues --join with de-duped sub-queries
    LEFT OUTER JOIN table1 as a on a.key = keyvalues.key
    LEFT OUTER JOIN table2 as b on b.key = keyvalues.key
    ...
1 голос
/ 15 октября 2019

Я бы предложил совершенно другой подход, который я проиллюстрирую для 3 таблиц:

select key,
       max(field1) as field1, max(field2) as field2, max(field3) as field3
from ((select key, field1, null as field2, null as field3,
              row_number() over (partition by key order by key) as seqnum
       from table1
      ) union all
      (select key, null as field1, field2, null as field3,
              row_number() over (partition by key order by key) as seqnum
       from table2
      ) union all
      (select key, null as field1, null as field2, field3,
              row_number() over (partition by key order by key) as seqnum
       from table3
      )
     ) t
group by key, seqnum;

Это создаст «вертикальный список» для каждого поля для каждого ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...