Entwickler-Ecke

Datenbanken - SQL Abfrage: 2 Tabellen vergleichen => Unterschiede ausge


juergen - Mo 01.09.03 09:19
Titel: SQL Abfrage: 2 Tabellen vergleichen => Unterschiede ausge
Hallo.

ich möchte in einer MySQL DB 2 Tabellen miteinander vergleichen und die Datensaätze ausgeben die nicht in beiden Tabellen vorhanden sind;

Bsp.:
Tabelle1.Datensatz_x ist nicht in Tabelle2 vorhanden => Tabelle1.Datensatz_x wird ausgegeben ...

Kann mir jemand die SQL-Synntax geben !?

DANKE

juergen


MKehrer - Mo 01.09.03 13:48

Hi Jüregen,
ich glaub nicht, das es mit einer SQL-Syntax machbar ist.
Ich würde es so machen

1) select * from tabelle1
2) durch alle datensätze iterieren
- Primärschlüssel eines jeden Datensatzes von tabelle 1 lesen und
mit diesem Schlüssel einen Datensatz in tabelle2 selektieren
(ich hoffe du hast eine Primärschlüssel)
- restliche felder von den selektierten Datensätzen vergleichen und
dann entscheiden

wenn Du keinen Primärschlüssel hast must jeden DS von tabelle1 mit jedem DS von tabelle 2 vergleichen

Manfred[/b]


neojones - Mo 01.09.03 15:25

Natürlich geht das mit einer Abfrage!

Wenn Du weißt, dass nur in einer Tabelle Datensätze dazu gekommen sind, dann ist es ziemlich einfach:

SELECT * FROM table1 LEFT JOIN table2 ON table1.feldname=table2.feldname WHERE table2.feldname IS NULL

Damit werden alle ausgegeben, die in table2 nicht vorhanden sind.

Wenn es in beiden Tabellen neue Tupels (Datensätze) gibt, dann ists etwas komplizierter. Da müsste ich jetzt allerdings erst die Abfrage raussuchen. Dabei würde man, meines Wissens, zuerst mit einem Equi-Join das kartesische Produkt aufbauen und dann mit zwei LEFT JOINs einen Zusatz zum kartesischen Produkt bauen und dann in den beiden Tabellen, die über den LEFT-JOIN verbunden sind, nach NULL-Werten suchen. Das Problem bei der zweiten Möglichkeit: Sie ist ätzend langsam.

Die erste Möglichkeit ist aber in jedem Fall erheblich schneller als die von Manfred vorgeschlagene.

Viele Grüße,

Matthias

P.S.: Ergänzung zu Manfred: Die Lösung geht auch ohne PRIMARY KEY. Dann würde man auf beide Vergleichsfelder einen Index setzen, zwecks Performance, und einfach den JOIN über die beide indizierten Felder durchführen.


MKehrer - Mo 01.09.03 16:01

@neojones,

danke für Deine Aufklärung.
Da waren meine theoretischen Kentnisse wohl nicht ausreichend.
Hab mich aber gerade in die JOIN´s eingelesen.

Gibt´s auch eine Möglichkeit, einen JOIN über zwei Tabellen verschiedener
Datenbanken durchzuführen (Stichwort Datenbank-Update)?


neojones - Mo 01.09.03 16:12

Jo,

geht aber nicht in allen Datenbanksystemen. Das würde man dann so machen:

SELECT datenbank.tabelle.feld FROM datenbank.tabelle LEFT JOIN datenbank2.tabelle ON ...

:-)


MKehrer - Mo 01.09.03 16:43

@neojones,

wenn die beiden DB´s nur über 2 verschiedene Connections erreichbar sind ( z.B. 2 .mdb-Dateien), dann wird´s wahrscheinlich nicht gehen, oder?


juergen - Mo 01.09.03 16:53

@neojones

sehr schön !!!
genau das bringt mich weiter

vielen dank

juergen


neojones - Di 02.09.03 07:28

@MKehrer: Leider gibts dann keine Möglichkeit. Dann kann man nur im Delphi direkt mit einer Master-Detail-Beziehung arbeiten.

Obwohl es bei mySQL eine etwas unkonventionelle Möglichkeit auf der Konsole geben könnte, indem man die Standardausgabe umleitet, etc.

Viele Grüße,

Matthias