Diff zwischen zwei Tabellen (Oracle9i)

Hallo!

Ich habe zwei Tabellen mit „gleichen“ Datensätzen, und möchte die Differenzen ermitteln.
In TabA und TabB stehen

Aufbau der Tabellen (vereinfacht):

KundenID
KundenName
KundenVorname

(in Wirklichkeit sind es ca. 20 Felder!)

In beiden Tabellen, TabA und TabB, ist z.B. der Kunde 123 angelegt, nur heißt er in TabA „123, Mustermann, Max“ und in TabB vielleicht fälschlicherweise „123, Musterman, Max“.

Bisher habe ich Datensätze mit Differenzen mittels UNION ermittelt:
Ist ein Datensatz in beiden Tabellen in allen Spalten identisch, erscheint er nur einmal in der UNION, ansonsten zweimal.

Gut, damit habe ich immerhin die KundenID der Datensätze, bei denen etwas nicht stimmt.
Ich möchte mir aber jeweils die Felder anzeigen lassen, in denen Differenzen bestehen.
Nur wie???

Ich hoffe, ihr könnt mir dabei helfen!
Ich arbeite auf Oracle9i unter WinNT.

Grüße,
Nina

die Datenbank ist mir gar völlig wurscht ;o))
select tabA.*, tabB.* from tabA,TabB where tabA.id = tabB.ID and tabA.feld1 tabB.Feld1 and usw…

Bernd

natürlich nicht and sondern or beim where (OT)

Hallo Bernd!

das würde ja schon mal funktionieren - danke.

Aber:
Ich habe die Daten, die mir die UNION geliefert hat, bereits in einer Tabelle TabC stehen (genau diese UNION brauche ich nämlich noch für was anderes).
Ich muss also auf die TabC aufsetzen.

da steht z.B. drinnen:
123 Musterman Max
123 Mustermann Max

Außerdem soll die Auswertung möglichst schnell gehen.

Dieses Konstrukt

select tabA.*, tabB.* from tabA,TabB where tabA.id = tabB.ID
and tabA.feld1 tabB.Feld1 and usw…

dauert doch ziemlich lange, insbesondere wenn sehr viele Datensätze vorhanden sind.
Aktuell arbeite ich nur auf einer kleinen Test-Tabelle, im Produktiveinsatz hat die Tabelle allerdings mehrere 10.000 Datensätze.

Grüße,
Nina

hi!

Hallo Bernd!

heiß ich zwar nicht, antworte aber trotzdem

Ich habe die Daten, die mir die UNION geliefert hat, bereits
in einer Tabelle TabC stehen (genau diese UNION brauche ich
nämlich noch für was anderes).
Ich muss also auf die TabC aufsetzen.

also, daß die sätze in taba und tabb unterschiedlich sind, ist egal? du willst nur die differenzen aus tabc?

select *
from tabc a, (select id,count(*)
from tabc
group by id
having count(*)>1) b
where a.id = b.id
order by a.id

ist es das?

Aktuell arbeite ich nur auf einer kleinen Test-Tabelle, im
Produktiveinsatz hat die Tabelle allerdings mehrere 10.000
Datensätze.

das sollte bei ora9 aber sogar für nicht perfomante selects kein problem sein …

grüße,
tomh

Hi!

Mach dir mal über die Performance da noch keine Sorgen…bei ein paar 10.000 Datensätzen lacht sich Oracle noch kringelig ;o)) Man kann sich dafür ja auch schnell eine View basteln was die Performance noch erheblich verbessert.

Bei deinem Weg musst du ja erst die Union-Abfrage durchführen und darauf dann die neue, was wohl auch nicht performanter ist ;o).

Normaler Weise ist für so ein Problem Access die richtige Anwendung. Man schreibt sich ratzfatz ne kleine anwendung die der Reihe nach die unterschiedlichen Datensätze anzeigt und wo man zügig die Änderungen eintragen kann. Da ich mal stark hoffe, daß du ja nciht ewig zwei Tabellen mit Kundendaten mit rumschleppst ist das ja ne einmalige Sache - also scheiss was auf die Performance ;o)

Ansosnten müsste Toms Weg funktionieren wobei du dann aber vermutlich nicht weist welcher Datensatz aus welcher Tabelle stammt!

Gruß

Bernd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

Ansosnten müsste Toms Weg funktionieren wobei du dann aber
vermutlich nicht weist welcher Datensatz aus welcher Tabelle
stammt!

select 'taba: ’ tab_name …

*grmpf* nun weiß sie’s :wink:

grüße,
tomh

Hallo!

Ich habe zwei Tabellen mit „gleichen“ Datensätzen, und möchte
die Differenzen ermitteln.
In TabA und TabB stehen

Aufbau der Tabellen (vereinfacht):

KundenID
KundenName
KundenVorname

(in Wirklichkeit sind es ca. 20 Felder!)

In beiden Tabellen, TabA und TabB, ist z.B. der Kunde 123
angelegt, nur heißt er in TabA „123, Mustermann, Max“ und in
TabB vielleicht fälschlicherweise „123, Musterman, Max“.

Bisher habe ich Datensätze mit Differenzen mittels UNION
ermittelt:
Ist ein Datensatz in beiden Tabellen in allen Spalten
identisch, erscheint er nur einmal in der UNION, ansonsten
zweimal.

Gut, damit habe ich immerhin die KundenID der Datensätze, bei
denen etwas nicht stimmt.
Ich möchte mir aber jeweils die Felder anzeigen lassen, in
denen Differenzen bestehen.
Nur wie???

Ich hoffe, ihr könnt mir dabei helfen!
Ich arbeite auf Oracle9i unter WinNT.

Die KundenId kannst du recht einfach über eine Filter-Abfrage finden, dazu musst du nicht selbst nach boubletten suchen:

SELECT COUNT(*) AS doppelt,KundenId
FROM
GROUP BY KundenId
HAVING doppelt > 1

Möchtest du die doppelten Einträge pro KundenId wissen, musst du das entweder ausprogrammieren (nicht SQL, daher OT) oder eine Kreuztabellenabfrage verwenden. An den Achsen der Kreuztabelle führst du KundenId und die Spaltennamen auf. Die Kreutabelle selbst füllst du mit der Aggregationsfunktion COUNT(DISTINCT spaltenname).
Die Kreuztabelle musst du dir allerdings selbst zusammen schmieden, ich habe die SQL Syntax dazu nicht im Kopf. Wenn alles rund läuft, legst du dir die Tabelle sinnvollerweise als view an.

Gruß Markus