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