Ich möchte 3 Tabellen verbinden, alle mit denselben Daten, außer dass eine Spalte einen anderen Namen hat (unterschiedliches Datum für jede der 3 Tabellen). Die drei Tabellen sehen wie folgt aus. Das Ziel ist, wenn eine Bedingung in Tabelle 1 vorhanden ist UND / oder Tabelle 2 für jede einzelne ID / Bedingung zu bestimmen, ob eine Bedingung in Tabelle 3 vorhanden ist oder nicht. Ich bin derzeit damit beschäftigt, Tabelle 2 mit Tabelle 1 zu verbinden, aber ich bin mir bewusst, dass dies nicht berücksichtigt wird, wenn eine Bedingung in Tabelle 2 vorliegt, die nicht in Tabelle enthalten ist, die nicht berücksichtigt wird. Auf jeden Fall wäre jede Hilfe hilfreich .

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

Vielen Dank!

-1
Brad 22 Feb. 2020 im 01:58

4 Antworten

Beste Antwort

Wie wäre es damit (SQL Server-Syntax) ...

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
Isaac 21 Feb. 2020 im 23:14

Sie benötigen ein full outer join von table1 und table2 und ein left join für 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)

Siehe die Demo.
Ergebnisse:

>  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
forpas 22 Feb. 2020 im 16:23

Sie scheinen alles in Tabelle 3 und Übereinstimmungen in den beiden anderen Tabellen zu wollen. Das ist nur left join s:

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;
0
Gordon Linoff 21 Feb. 2020 im 23:17

Wenn Ihre Datenbank full join unterstützt, können Sie einfach Folgendes tun:

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)

Ansonsten ist es etwas komplizierter: union all und Aggregation ist eine Methode:

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
1
GMB 21 Feb. 2020 im 23:04