
MainframeSupports tip uge 39/2003:
I uge 33/2003 skrev jeg om, hvor let det er at sammenligne
to datasets eller members med hinanden. Hvis man vil sammenligne indholdet af to DB2-tabeller,
så kommer man på en langt sværere opgave. Der er ikke umiddelbart
nogen SQL faciliteter til at foretage sammenligninger med. Jeg har kun kendskab til et
enkelt produkt kaldet Compare for DB2 fra Princeton Softech, som kan gøre det, men mon
ikke BMC og CA har lignende produkter. Men hvad hvis nu man ikke lige har et produkt
tilgængeligt.
Mit første bud er at bruge SPUFI. Lav en SELECT * fra den ene tabel i SPUFI og lav
derefter en SELECT * fra den anden tabel i SPUFI, men til et andet dataset. Herefter kan man
sammenligne de to datasets med ISPF EDIT COMPARE. Det kræver dog, at der er en
fornuftig ORDER BY på den SELECT *, man foretager.
Hvis man kun er interesseret i at finde ud af, om de to tabeller har præcis
samme indhold og umiddelbart er ligeglad med forskellene, så kan
følgende fremgangsmåde anvendes. Først laver man en SELECT COUNT(*)
fra en af de to tabeller. herefter laver man en SELECT COUNT(*) fra den anden tabel.
Disse to antal skal selvfølgelig være ens. Til sidst laver man en UNION af
de to tabeller:
SELECT * FROM new.mytable
UNION
SELECT * FROM old.mytable
Hvis dette SQL-kald returnerer det samme antal rækker som var antallet fra de
forudgående SELECT COUNT(*), så har de to tabeller præcis samme indhold.
Fidusen ved UNION er netop, at hvis to eller flere rækker i de to SELECT's er ens,
så sørger UNION for kun at returnere een af dem. Man kan selvfølgelig
risikere, at der er dubletter af rækker i samme tabel. Disse dubletter vil UNION
også fjerne, og så kan ovenstående metode faktisk være
værdiløs. Hvis der er et unikt index på de to tabeller, så er metoden
til gengæld 100% sikker.
Fra og med DB2 version 7 vil følgende SQL-kald kunne anvendes:
SELECT COUNT(*) FROM new.mytable
UNION
SELECT COUNT(*) FROM old.mytable
UNION
SELECT COUNT(*) FROM
( SELECT * FROM new.mytable
UNION
SELECT * FROM old.mytable
) temptable
Hvis dette SQL-kald returnerer een række, så er de to tabeller ens,
med de samme forbehold som før. I version 7 er det blevet muligt at benytte UNION i
subselects og dermed også i nested table expressions.
Forrige danske tip
Last tip in english
Tip oversigten
|