join из двух таблиц в один стобец
Имеются три таблицы:
CREATE TABLE #main (date_time date, id varchar(50)); -- основная таблица
INSERT INTO #main VALUES
('2020-07-01', '11'),
('2021-02-09', '11'),
('2019-01-29', '22'),
('2018-03-14', '22'),
('2020-04-19', '22');
CREATE TABLE #t1 (date_time date, id varchar(50), product varchar(50)); -- данные до 2020
INSERT INTO #t1 VALUES
('2019-01-29', '22', 'Phone'),
('2018-03-14', '22', 'Charger');
CREATE TABLE #t2 (date_time date, id varchar(50), product varchar(50)); -- данные после 2020
INSERT INTO #t2 VALUES
('2020-07-01', '11', 'PC'),
('2021-02-09', '11', 'Printer'),
('2020-04-19', '22', 'Phone');
В таблицах t1 и t2 присутствуют даные для таблицы main. В t1- данные до 2020 года, t2-после. Вопрос, как к таблице main приджойнить стобец product , который будет в себя включать данные как из t1, так и t2?
Ответы (2 шт):
Автор решения: teran
→ Ссылка
объедините выборку обеих таблиц через union all
select *
from #main
inner join (
select x from #t1
union all
select x from #t2
) ON (...)
либо
select * from #main
inner join #t1 ...
UNION ALL
select * from #main
inner join #t2
либо джойнте обе, и выберите непустое
select m.*, COALESCE(t1.product, t2.product)
from #main as m
left join #t1 as t1 on (..)
left join #t2 as t2 on (..)
тут также можно использовать и ISNULL(t1.product, t2.product)
Автор решения: PotroNik
→ Ссылка
Что бы исключить пересечение id, которые могут находится и в t1 и в t2, попробуйте разделить их по году, пример:
select
m.date_time,
m.id,
case when #t1.id is null then #t2.id else #t1.id end,
case when #t1.product is null then #t2.product else #t1.product end,
case when #t1.date_time is null then #t2.date_time else #t1.date_time end
from #main m
left join #t1
on m.id = #t1.id
and YEAR(m.date_time) < 2020
left join #t2
on m.id = #t2.id
and YEAR(m.date_time) >= 2020
Соединение с первой таблицей по id и году меньше 2020
Соединение со второй таблицей по id и году равному или выше 2020