2 Tabellen mit mit schwierigen Kriterien zusammenführen

Martin Kurz

Neuer Benutzer
Beiträge
3
Hallo zusammen!

Ich möchte 2 Tabellen (entsprechen 2 unterschiedlichen Jahren über das selbe Thema) zusammenführen, wobei folgende Problem vorhanden sind:

1.) nur eine Spalte ist im Titel ident (Ich dachte mir die könnte ich für ein JOIN benützen) und die Feldinhalte passen zusammen.
2.) einige Spalten haben unterschiedliche Name, aber zusammenpassende Feldinhalte
3.) einige spalten der 2. Tabelle haben keine Entsprechung in der anderen Tabelle.

Egal, was ich ausprobiert habe, ich bin kläglich damit gescheitert. Am nächsten bin ich noch mit einem full join gekommen, allerdings bringt mir MySQL da ein kartesisches Produkt. Das ist auch wieder nicht brauchbar.

Danke für Eure Bemühungen!
 
Werbung:
Falls Du mit "zusammenführen" meinst, dass der Inhalt der einen Tabelle dauerhaft in der anderen Tabelle eingefügt wird, so ist die Lösung ein INSERT ... SELECT....

Zeig uns doch mal genau, was Du versuchst hast.
 
In aller Regel ist ein Datenbank-Design, das die selbe Entität (Tabelle) nach Jahren aufteilt, einfach falsch. insofern wäre es interessant zu wissen wie das zu Stande gekommen ist.

zu 1.)
Die Primarykeys werden vermutlich keinen Bezug zu einander haben es sei denn der Inhalt wurde ursprünglich mal kopiert. Ein Join wäre aber auch dann hier eher die falsche Wahl denn die Daten wären mit ID | Information_Jahr1 | Information_Jahr2 nicht richtig strukturiert. Eventuell will man das in der Ausgabe so haben (Stichwort PIVOT) aber für eine Datenhaltung wäre ID | Jahr | Information richtig. Ich würde es eher mit UNION ALL angehen, also z.B.:

Code:
SELECT 'Jahr1' AS Jahr,* FROM tabelle1
UNION ALL
SELECT 'Jahr2' AS Jahr,* FROM tabelle2

zu 2.)
Offensichtlich sind die Tabellen ja nicht 100% identisch, Spaltennamen sind dabei nicht so tragisch. Sind denn die Datentypen identisch?

zu 3.)
Daher wirst du in meinem Beispiel die Selects ausformulieren müssen und kannst nicht einfach * verwenden. Den Select für Tabelle 1 kannst du auch mit NULL "auffüllen".
Code:
SELECT 'Jahr1' AS jahr,spalte1,spalte2,NULL FROM tabelle1
UNION ALL
SELECT 'Jahr2' AS jahr,spalte1,spalte2,spalte3 FROM tabelle2
 
Du hast Recht, die beiden Tabellen entstammen Excel-files (als CSV abgespeichert), die von 2 unterschiedlichen Datenbanken, die 2018 gewechselt wurden, exportiert wurden. Auf die beiden Datenbanken habe ich keinen direkten Zugriff, sondern ich bekomme nur Excel-Auszüge (nennen wir's mal so), die als Format Jahre haben.

Da die Eintrage doch im Endeffekt ca. 600.000 Datensätze haben werden, bin ich in Excel natürlich weit über der Grenze des machbaren und daher auf SQL gewechselt. Außerdem haben die Datenbanken nichts mit Geschäftsdaten zu tun, sondern es sind eher biologische Daten.

In eine ordentliche Datenbankstruktur muss ich das Ganze dann nachher bringen. Dacht' ich mir zumindest.
 
Da die Eintrage doch im Endeffekt ca. 600.000 Datensätze haben werden, bin ich in Excel natürlich weit über der Grenze des machbaren und daher auf SQL gewechselt.
Also geht es hier primär um eine Konsolidierung.
INSERT ... SELECT....
Das wäre m.E. schon der richtige Ansatz. Natürlich kann man das "Ergebnis" vorweg nehmen, in dem man Union Abfragen verwendet wie @ukulele geschrieben hat.

In eine ordentliche Datenbankstruktur muss ich das Ganze dann nachher bringen
Genau! Daher würde ich vielleicht noch etwas radikaler vorgehen. Mglw. mit dem Gedanke im Hinterkopf, dass diese Schritte (Excelexport vom vorletzten Jahr, dann der vom letzten Jahr, ..
nächstes Jahr usw. wieder anstehen.
Aber auch so, einmalig folgender Vorschlag:
Lege eine "Zieltabelle" für den Import an, die eine strukturelle Vereinigung der beiden Excellisten bildet. Alles was 100% (nur wenn Du sicher bist*) passt in gemeinsame Spalten, alles andere in eigene. Also eine Tabelle mit relativ viel Luft.. (Ebensogut könntest Du fast auch 2 separate Tabellen anlegen)
Auf dieser Tabelle kannst Du nun die Konsolidierung machen.
a) Inhalte statistisch erfassen und auf "Gleichheit"/ Verwandheit mit ähnlichen Spalten prüfen
b) Select Statements erstellen, die die Strukturprobleme on the fly angleichen

a und b kannst Du iterativ machen.
am Ende liefert das Select Statement die Vereinigungmenge.
Das kannst Du in eine ganz neue Ergebnistabelle schreiben. Alles vorher war nur Import und Konsolidierung.

Was Du wenn nötig nebenbei machen kannst, keine bloße Vereinigung, sondern auch eine Optimierung im Sinne der Normalisierungsregeln für RDBMS.

*) Sicher bist Du nur, wenn Du alle Werte der Quellspalte mit der verwandten Spalte verglichen hast. Das geht viel besser in SQL als in Excel.

Und was nicht gefragt war, was ich mir aber nicht verkneifen kann:
Wenn Du damit eh gerade beginnst, nimm lieber Postgres als mySQL. Du vergößerst Deinen Werkzeugkasten deutlich und kostenlos und hast sicher mehr Freude an weniger Arbeit.
 
Also geht es hier primär um eine Konsolidierung.

Genau! Daher würde ich vielleicht noch etwas radikaler vorgehen. Mglw. mit dem Gedanke im Hinterkopf, dass diese Schritte (Excelexport vom vorletzten Jahr, dann der vom letzten Jahr, ..
nächstes Jahr usw. wieder anstehen.
Ja, das wird immer wieder passieren, jedes Jahr.
Aber auch so, einmalig folgender Vorschlag:
Lege eine "Zieltabelle" für den Import an, die eine strukturelle Vereinigung der beiden Excellisten bildet. Alles was 100% (nur wenn Du sicher bist*) passt in gemeinsame Spalten, alles andere in eigene. Also eine Tabelle mit relativ viel Luft.. (Ebensogut könntest Du fast auch 2 separate Tabellen anlegen)
Auf dieser Tabelle kannst Du nun die Konsolidierung machen.
a) Inhalte statistisch erfassen und auf "Gleichheit"/ Verwandheit mit ähnlichen Spalten prüfen
b) Select Statements erstellen, die die Strukturprobleme on the fly angleichen

a und b kannst Du iterativ machen.
am Ende liefert das Select Statement die Vereinigungmenge.
Das kannst Du in eine ganz neue Ergebnistabelle schreiben. Alles vorher war nur Import und Konsolidierung.

Was Du wenn nötig nebenbei machen kannst, keine bloße Vereinigung, sondern auch eine Optimierung im Sinne der Normalisierungsregeln für RDBMS.

*) Sicher bist Du nur, wenn Du alle Werte der Quellspalte mit der verwandten Spalte verglichen hast. Das geht viel besser in SQL als in Excel.
Es gibt nur eine einzige Spalte, bei der ich mir 100% sicher bin, dass sie ident ist.
Und was nicht gefragt war, was ich mir aber nicht verkneifen kann:
Wenn Du damit eh gerade beginnst, nimm lieber Postgres als mySQL. Du vergößerst Deinen Werkzeugkasten deutlich und kostenlos und hast sicher mehr Freude an weniger Arbeit.
Muss ich mal überlegen.

Aber jedenfalls herzlichen Dank!
 
Werbung:
Um Daten zu vergleichen und auszuwerten muss es erstmal nicht alles so ordentlich sein aber das was man dann langfristig behalten will das sollte auf jeden Fall in eine saubere Struktur übernommen werden.

Wenn dein Ident wirklich passt, also jedes Jahr ein Datensatz mit dem selben Schlüssel vorliegt, dann gehen auch Joins sehr gut um Spalten zu vergleichen, nur solltest du wirklich nie anfangen die selbe Spalte für jedes Jahr anzulegen, das ist wirklich das schlimmste was du tun kannst.
 
Zurück
Oben