J'ai une requête comme celle ci-dessous:La meilleure façon de réécrire une clause WHERE NOT IN?
Select ser.key
From dbo.Enrlmt ser
Where ser.wd >= @FromDate AND ser.wd <= @ThrouDate AND
ser.EnrlmtStatCode = '4321' AND
ser.StuExitCatgCode in ('1','2','3','4','5','6','7') AND
ser.Key not in (select Key
from Enrlmt ser2
where ser2.StartDate <= @AsOfDate
AND ser2.StartDate > ser.wd
AND ser2.EnrlmtStatCode = '4321')
extrêmement lent en raison de la clause « NOT IN ». J'ai essayé de le réécrire en utilisant une jointure externe gauche pour qu'elle ressemblait à:
Select ser.key
From dbo.Enrlmt ser
LEFT JOIN dbo.Enrlmt ser2 ON ser.key = ser2.key
AND ser2.StartDate <= @AsOfDate
AND ser2.StartDate > ser.wd
AND ser2.EnrlmtStatCode = '4321'
Where ser2.key is null
AND ser.wd >= @FromDate
AND ser.wd <= @ThrouDate
AND ser.EnrlmtStatCode = '4321'
AND ser.StuExitCatgCode in ('1','2','3','4','5','6','7')
Ce qui est beaucoup plus rapide, mais les résultats ne correspondent pas. Est-ce que je fais quelque chose de mal avec cette réécriture? Y a-t-il une meilleure manière de faire cela?
'NOT IN' est pas lent - c'est parce que vous utilisez un sous-requête corrélée. –
L'entrée NOT IN * n'entraîne pas votre problème de performance, en supposant que les colonnes ne soient pas Nullable: http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join- is-null-sql-server/ –
La recherche de nombres comme des chaînes me fait aussi grincer des dents –