Schönen Tag,

Ich muss identische Tabellenstrukturen haben. Eine ist die Basistabelle und die zweite hat inkrementelle Änderungen. Ich möchte eine resultierende Tabelle haben, damit ich die Zeilen aus dem Update auswählen kann, falls vorhanden. Ansonsten vom alten Tisch.

Wie so

table a: | Table b: | Result table: 
key val  |  key val | key val 
1   a    |  2   bb  |  1   a   
2   b    |  4   dd  |  2   bb
3   c    |  5   ee  |  3   c
4   d    |          |  4   dd
                       5   ee

Ich habe versucht, B-Tabellenwerte für innere Verknüpfung und vollständige äußere Verknüpfung auszuwählen, wobei a.key NULL oder b.key NULL und union ist. (Code noch nicht auf Funktionalität getestet.)

select * from 
(
  (select table_B.* from 
    TABLE_A
      inner join 
    TABLE_B
    on TABLE_A.key = TABLE_B.key 
  )
  UNION 
  (select * from 
    TABLE_A
     full outer join
    TABLE_B
  on TABLE_A.key = TABLE_B.key 
  where TABLE_A.key is NULL or TABLE_A.key is NULL
  )
)

Gibt es einen einfacheren Weg, dies zu tun? Ich hatte das Gefühl, dass es dafür einen robusteren Weg geben muss.

BEARBEITEN: Ich implementiere dies derzeit im SPARK SQL-Kontext, hatte jedoch ähnliche Probleme in der SQL Server-Umgebung. Dennoch suche ich nach einer allgemeinen Idee.

sql
0
pinegulf 19 Feb. 2020 im 17:31

3 Antworten

Beste Antwort

Nach meinem Verständnis würde dies helfen

select key, val from Tableb
union
select key, val from Tablea a 
where not exists(select 1 from Tableb where a.key = b.key)
1
zip 19 Feb. 2020 im 14:50

Eine Methode ist full join:

select key, coalesce(i.value, m.value) as value
from master m full join
     incremental i
     using (key);
0
Gordon Linoff 19 Feb. 2020 im 15:04

Sie erwähnen nicht, welche Datenbank Sie verwenden, daher gehe ich davon aus, dass sie FULL OUTER JOIN implementiert. Du kannst tun:

select
  coalesce(a.key, b.key),
  case when b.key is not null then b.val else a.val end
from a
full outer join b on a.key = b.key
order by coalesce(a.key, b.key)
1
The Impaler 19 Feb. 2020 im 14:34