875 Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Moin moin!

Ich habe folgendes Problem:

ich habe 2 Tabellen, beide tabellen haben das schema nr | wert_a
wert_b, bei tabelle a ist aber nur wert a eingetragen und wert b leer, bei
tabelle b genau umgekehrt

die nummern sind jeweils in einer tabelle nur einmal vorhanden, das ist
so eine art id aber ohne auto increment und unsortiert, jedoch
überschneiden die nummern sich teilweise untereinander....

als beispiel:

tabelle a:
nr | wert_a | wert_b
1 | abcdef | ---------- |
9 | cdasdi | ---------- |
3 | dasddi | ---------- |

tabelle b:
nr | wert_a | wert_b
3 | ---------- | b
6 | ---------- | cdas
1 | ---------- | da

ich möchte nun beide Tabellen zu einer zusammenführen, so dass
wenn die nr in beiden tabellen existiert, beide werte der nummer
zugeschrieben werden. existiert nur eine in der tabelle, soll das feld, wo
die nr nicht existiert, leer bleiben. das ergebnis soll also folgendes sein:

nr | wert_a | wert_b
1 | abcdef | da
9 | cdasdi |
3 | dasddi | b
6 | ---------- | cdas

nach langem googlen weiß ich jetzt, dass ich irgendwie mit join arbeiten
muss, aber welchen join nehme ich, warum und wie muss die syntax
aussehen?

vielen dank schonmal im voraus!

1 Antwort

0 Punkte
Beantwortet von Experte (3.2k Punkte)
Da du auch Datensätze willst, die in einer Tabelle keinen Eintrag haben, wäre Full Outer Join hier der richtige Ansatz.
Hier gibts dafür eine nette Übersicht als Venn-Diagramme.

Das SQL-Statement müsste also etwa so aussehen:
SELECT tabelle_a.nr as nr,tabelle_a.wert_a as wert_a,tabelle_b.wert_b as wert_a
FROM tabelle_a
FULL OUTER JOIN tabelle_b
ON tabelle_a.nr=tabelle_b.nr;

Das musst du dann nurnoch in die neue Tabelle einfügen (hier als zusammengesetzter, vollständiger Befehl:
INSERT INTO tabelle_zusammen (nr,wert_a,wert_b)
SELECT tabelle_a.nr as nr,tabelle_a.wert_a as wert_a,tabelle_b.wert_b as wert_a
FROM tabelle_a
FULL OUTER JOIN tabelle_b
ON tabelle_a.nr=tabelle_b.nr;


Beispiele sind von mir (momentan mangels Testumgebung...) nicht getestet, Verwendung auf eigene Gefahr. Vor produktivem Einsatz also erstmal ausgiebig testen.
Besonders beim zweiten Befehl (Insert) bin ich mir nicht wirklich sicher, dass das so richtig ist. In dieser Form hab ich das noch nie wirklich gebraucht.

Ele
...