For nogen versioner af DB2 siden dukkede der et par alternativer til UNION op. De hedder INTERSECT og EXCEPT. INTERSECT udvælger de rækker, der er fælles for de to SELECT statements, som INTERSECT skrives mellem. Endnu mere interessant er EXCEPT, som udvælger de rækker i den første SELECT, som ikke er med i den anden SELECT. Netop derfor er EXCEPT interessant, da den kan bruges som erstatning for NOT EXISTS.
Lad mig demonstrere EXCEPT med et eksempel. Opgaven er at finde de tabeller i system-kataloget, der ikke har nogen tilhørende indexer. Det løses traditionelt med følgende SQL statement:
Ved at bruge EXCEPT kan opgaven i stedet løses med følgende SQL statement:
Resultatet af disse to SQL statements er nøjagtig det samme, nemlig en liste over de tabeller i system-kataloget, der ikke er defineret nogen indexer på. Forskellen ligger i måden DB2 løser opgaven på, og det er her, at EXCEPT nogen gange kan være et godt alternativ til NOT EXISTS. I begge tilfælde vil DB2 starte med at finde alle tabeller i SYSIBM.SYSTABLES, der opfylder betingelserne i WHERE-delen.
I det første eksempel vil DB2 for hver fundet tabel finde ud af, om der er en række i SYSIBM.SYSINDEXES, der hører til tabellen. Hvis DB2 ikke finder sådan en række, kommer tabellen med i det endelige resultat. I det andet eksempel vil DB2 finde alle indexer i SYSIBM.SYSINDEXES, der opfylder betingelserne i WHERE-delen. Herefter vil DB2 fjerne de rækker fra den første SELECT, som er magen til rækker i den anden SELECT.
Det vil helt afhænge af opgavens karakter, om det kan betale sig at benytte den ene eller den anden metode. Jeg vil normalt starte med at benytte NOT EXISTS, men hvis det går for langsomt vil jeg prøve med EXCEPT i stedet. Generelt vil NOT EXISTS være mindst CPU krævende, men have længst svartid, hvis der skal behandles mange rækker. Det omvendte gælder for EXCEPT.