Autor Beitrag
juergen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 87



BeitragVerfasst: Mo 01.09.03 09:19 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: 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]

_________________
Manfred
Was Du siehst ist in Dir (Smile)
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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.

_________________
Ha! Es compiliert! Wir können ausliefern!
MKehrer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: 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)?

_________________
Manfred
Was Du siehst ist in Dir (Smile)
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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 ...

:-)

_________________
Ha! Es compiliert! Wir können ausliefern!
MKehrer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: 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?

_________________
Manfred
Was Du siehst ist in Dir (Smile)
juergen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 87



BeitragVerfasst: Mo 01.09.03 16:53 
@neojones

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

vielen dank

juergen
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: 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

_________________
Ha! Es compiliert! Wir können ausliefern!