MainframeSupports
tip uge 37/2005:

Dette tip var godt nok svært at navngive, så jeg håber, at du får fornøjelse af det. I DB2 version 7 blev der i SQL WHERE delen introduceret en feature kaldet row-value-expression. Denne går ud på, at du kan angive en liste af kolonner eller konstanter, som du så kan sammenligne med en anden liste med samme antal elementer. Du kan også sammenligne listen med resultatet af en IN subselect.

Lad mig komme med et eksempel, som er meget bedre end lange beskrivelser:

...
WHERE A = 3
AND B = 'SOLEN'

Kan med en row-value-expression omskrives til:

...
WHERE (A, B) = (3, 'SOLEN')

Ovenstående omskrivning kan spare en hel del skrivearbejde og i nogen situationer gøre dit SQL-kald mere læseligt. Når jeg ser den slags nyskabelser, så skal det selvfølge straks afprøves i andre sammenhænge. Desværre er den eneste anden lovlige sammenhæng i forbindelse med en IN subselect:

...
WHERE (A, B) IN
( SELECT X, Y
FROM ANOTHER_TABLE
)

Da jeg afprøvede ovenstående gik mit SQL-kald nærmest i selvsving og vendte først tilbage med et resultat efter laaaaaang tids venten, hvor en:
...
WHERE EXISTS
( SELECT 0
FROM ANOTHER_TABLE
WHERE (A, B) = (X, Y)
)

gav mig svaret lige med det samme. Jeg vil derfor anbefale dig at udvise stor forsigtighed med row-value-expressions sammen med IN subselects. Jeg kan nu heller ikke lige få øje på værdien af disse, da en EXISTS løser opgaven. Der er selvfølgelig den finte, at man kan få sin IN til at være non-correlated, hvor en EXISTS altid vil være correlated, men det kræver jo, at optimizeren rent faktisk udfører SQL-kaldet på en fornuftig måde. Det gør den tilsyneladende ikke endnu.

Forrige danske tip        Last tip in english        Tip oversigten