PDA

View Full Version : SQL kompletten Datensatz vergleichen



f.bengsch
06-06-07, 14:03
Hallo,
ich möchte mit SQL auf unserer iSeries zwei gleiche Dateien mit gleichem Satzaufbau und n-Feldern auf Unterschiede vergleichen.
Gibt es im SQL die Möglichkeit, den Vergleich nicht auf Feldebene, sonderen auf Satzebene auszuführen (ich habe keine Lust jedes einzelne Fed zu prüfen).

Ich stelle mir den Befehl so oder so ähnlich vor :

select 'neu', record from datei1 where datei1.record not in (select datei2.record from datei2) union
select 'alt', record from datei2 where datei2.record not in (select datei1.record from datei1)

Wenn die Dateien nur 1 Feld haben, funktionierts mit sql. Ich kopiere die Datei1 in Datei2 bevor ich die Datei1 z.B. einmal wöchentlich neu fülle,

Gruß aus Bremen
Frank Bengsch

Fuerchau
06-06-07, 14:17
Da muss ich dich enttäuschen, so einfach geht das nicht:

select * from neu
where feld1 concat feld2 concat ... not in (select feld1 concat feld2 concat ... from alt)
union all
select * from alt
where feld1 concat feld2 concat ... not in (select feld1 concat feld2 concat ... from neu)

ggf. sind numerische Felder noch mit CHAR(numfield) zu konvertieren.

Für solche Aufgaben ist ILE/RPG auf jeden Fall besser geeignet, da du dort Strukturen (dXNEU DS EXTNAME(NEU) PREFIX(N)) vergleichen kannst.

BenderD
06-06-07, 14:37
create view diffs as(
select a.*
from datei1 a left join datei2 b
on a.feld1 = b.feld2,
...
a.feldx = b.feldx
where b.feld1 is null
union
select a.*
from datei2 a left join datei1 b
on a.feld1 = b.feld2,
...
a.feldx = b.feldx
where b.feld1 is null
)

einmal gemacht und dann nur noch

select * from difs

mfg

Dieter Bender


Hallo,
ich möchte mit SQL auf unserer iSeries zwei gleiche Dateien mit gleichem Satzaufbau und n-Feldern auf Unterschiede vergleichen.
Gibt es im SQL die Möglichkeit, den Vergleich nicht auf Feldebene, sonderen auf Satzebene auszuführen (ich habe keine Lust jedes einzelne Fed zu prüfen).

Ich stelle mir den Befehl so oder so ähnlich vor :

select 'neu', record from datei1 where datei1.record not in (select datei2.record from datei2) union
select 'alt', record from datei2 where datei2.record not in (select datei1.record from datei1)

Wenn die Dateien nur 1 Feld haben, funktionierts mit sql. Ich kopiere die Datei1 in Datei2 bevor ich die Datei1 z.B. einmal wöchentlich neu fülle,

Gruß aus Bremen
Frank Bengsch

B.Hauser
06-06-07, 15:06
Hallo,

wenn Du Release V5R3 oder höher hast, versuch folgendes:



. (Select * From Table1
Except
Select * From Table2)
Union
(Select * From Table 2
Except
Select * From Table1)


Bei dem ersten Except werden alle Sätze aufgelistet, die in Table1 und nicht in Table2 sind.
Beim zweiten Except werden alle Sätze aufgelistet, die in Tabel2 und nicht in Table1 sind.
Der Union bringt alle Sätze die entweder nur in der einen oder der anderen Tabelle sind.