SQL объединить таблицу с отдельными идентификаторами - PullRequest
0 голосов
/ 10 января 2020

В случае этих таблиц:

Таблица a

id | val 
---+-------
1  | foo
2  | bar
3  | spam 

Таблица b

id | val 
---+-------
1  | foo
2  | bar
4  | eggs 

Таблица c

id | val 
---+-------
0  | gaa
2  | bar
3  | spam

Как я могу выполнить объединение, чтобы столбец id содержал список всех 3 таблиц? То есть:

id | val 
---+-------
0  | gaa
1  | foo
2  | bar
3  | spam
4  | eggs 

Ответы [ 2 ]

1 голос
/ 10 января 2020
  • Для сценария Basi c, если нет одинаковых val для одного и того же id, используйте UNION
  • Если у вас разные val для одного и того же id вам нужно использовать некоторые логи c, чтобы удалить их следующим образом:

-

select id, val from
(select t.*, row_number() over (partition by id order by num) as rn from 
(select id, val, 1 as num -- number to add logic from to give priority to the data of table
from a
union all -- duplicate do not need to be removed as we handle it using analytical function 
select id, val, 2
from b
union all
select id, val, 3
from c) t)
where rn = 1;

Приведенный выше запрос всегда даст данные таблицы a для id val если есть разные val для одного и того же идентификатора.

Приветствия !!

1 голос
/ 10 января 2020

Как насчет union?

select id, val
from a
union   -- on purpose to remove duplicates
select id, val
from b
union 
select id, val
from c;

Это удаляет дубликаты.

Если значение val может измениться, и вы хотите получить значение из «первой» таблицы, то вы можете проверить наличие что:

select id, val
from a
union all
select id, val
from b
where not exists (select 1 from b where b.id = a.id)
union all
select id, val
from c
where not exists (select 1 from a where c.id = a.id) and
      not exists (select 1 from b where c.id = b.id);

Если на id есть индекс (скажем, это первичный ключ), то это может быть быстрее, чем в первой версии, использующей union.

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