Microsoft SQL Сервер условного объединения на основе 2 столбцов - PullRequest
0 голосов
/ 22 февраля 2020

Я хочу объединить 3 таблицы, все с одинаковыми данными, за исключением того, что один столбец имеет другое имя (разные даты для каждой из 3 таблиц). Три таблицы выглядят следующим образом. Цель состоит в том, существует ли условие в таблице 1 И / ИЛИ Таблица 2 определяет, существует ли условие в таблице 3 для каждого отдельного идентификатора / условия. В настоящее время я оставляю соединение таблицы 2 с таблицей 1, но я знаю, что не учитывается, если существует условие в таблице 2, которого нет в таблице, его не учитывают, в любом случае, любая помощь будет полезна для этого. ,

Table 1
    id  place Condition_2018 
    123  ABC  flu
    456  ABC  heart attack

Table 2
    id  place Condition_2019
    123  ABC  flu
    789  def  copd
Table 3
    id  place Condition_2020
    456  ABC  heart attack
    789  def  copd
    123  ABC  flu
OUTPUT:
Table 2
    id  place Condition_2018  Condition_2019  Condition_2020
    123  ABC  flu             flu             flu
    456  ABC  heart attack    null            heart attack
    789  def  NULL            copd            copd

Спасибо!

Ответы [ 4 ]

1 голос
/ 22 февраля 2020

Как насчет этого (SQL Синтаксис сервера) ...

SELECT 
    x.id
  , x.place
  , x.Condition_2018
  , x.Condition_2019
  , t3.Condition_2020 
FROM (
        SELECT 
            COALESCE(t1.id, t2.id) AS id
          , COALESCE(t1.place, t2.place) AS place
          , t1.Condition_2018
          , t2.Condition_2019
        FROM Table1 AS t1 
        FULL OUTER JOIN Table2 AS t2 ON t1.id = t2.id AND t1.place = t2.place
    ) AS x LEFT JOIN Table3 AS t3 ON x.id = t3.id AND x.place = t3.place
1 голос
/ 22 февраля 2020

Если ваша база данных поддерживает full join, вы можете просто сделать:

select
    id,
    place,
    t1.condition_2018,
    t2.condition_2019,
    t3.condition_2020
from table1 t1
full join table2 t2 using(id, place)
full join table3 t3 using(id, place)

В противном случае, это немного сложнее: union all и агрегация является одним из методов:

select 
    id, 
    place, 
    max(condition_2018) condition_2018,
    max(condition_2019) condition_2019,
    max(condition_2020) condition_2020
from (
    select id, place, condition_2018, null condition_2019, null condition 2020 from table1
    union all
    select id, place, null, condition_2019, null from table2
    select id, place, null, null, condition_2020 from table3
) t
group by id, place
0 голосов
/ 22 февраля 2020

Вам необходимо full outer join из table1 и table2 и от left join до table3:

select 
  coalesce(t1.id, t2.id) id,
  coalesce(t1.place, t2.place) place,
  t1.Condition_2018,
  t2.Condition_2019,
  t3.Condition_2020
from table1 t1 full outer join table2 t2
on t2.id = t1.id
left join table3 t3
on t3.id = coalesce(t1.id, t2.id)

См. Демонстрационную версию . Результаты:

>  id | place | Condition_2018 | Condition_2019 | Condition_2020
> --: | :---- | :------------- | :------------- | :-------------
> 123 | ABC   | flu            | flu            | flu           
> 456 | ABC   | heart attack   | null           | heart attack  
> 789 | def   | null           | copd           | copd 
0 голосов
/ 22 февраля 2020

Кажется, вы хотите все в таблице 3 и совпадения в двух других таблицах. Это просто left join с:

select t3.id, t3.place,
       t1.condition_2018, t2.condition_2019, 
       t3.condition_2020
from table3 t3 left join
     table2 t2
     on t3.id = t2.id and t3.place = t2.place left join
     table1 t1
     on t3.id = t1.id and t3.place = t1.place;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...