MainframeSupports
tip uge 12/2000:

Det sker ind imellem, at der på tværs af indexes, opstillede regler med mere kommer "snavs" ind i vores DB2-tabeller. Nogen gange drejer det sig om, at der er flere rækker med samme nøgleværdi, end det egentlig var meningen. Og så kan det være ret besværligt, dels at finde fejlen og dels at lokalisere og fjerne de ekstra rækker.

Ved at generalisere følgende SQL-statement kan man lokalisere rækker med samme "nøgleværdi" og få vist alle rækkerne. Man kan sågar selv vælge, hvad der er et acceptabelt antal rækker med samme "nøgleværdi". Eksemplet tager udgangspunkt i, at vi gerne vil identificere alle rækker i SYSIBM.SYSTABLES, hvor det samme tabelnavn optræder mere end een gang:

SELECT tab.*
FROM sysibm.systables tab
   , (SELECT name
      FROM sysibm.systables
      GROUP BY name
      HAVING COUNT(*) > 1
     ) keyvalue
WHERE tab.name = keyvalue.name
ORDER BY tab.creator, tab.name

Tricket ligger i at danne en temporær tabel med alle de efterspurgte nøgleværdier og så joine disse nøgleværdier med den tabel, hvor nøgleværdierne optræder. Nu er det typisk mere komplicerede sager med flere kolonner, der tilsammen udgør nøgleværdien, men princippet er et samme. Den temporære tabel (i eksemplet kaldet keyvalue) skal indeholde de kolonner, der udgør den efterspurgte nøgleværdi og det samme skal den tilhørende GROUP BY. Man skal også huske at joine samtlige kolonner i den temporære tabel med de tilsvarende kolonner i den rigtige tabel.

HAVING COUNT(*) kan sammenlignes med hvad man har lyst til. Det kunne eksempelvis være, at problemet var, at der skulle findes to eller flere rækker med nøgleværdien, men at der havde sneget sig en masse rækker med kun en forekomst af nøgleværdien ind i tabellen. Så skal HAVING COUNT(*) = 1 benyttes i stedet. Variationerne og mulighederne er mange.

Sidste uges tip        Tip oversigten