Typiquement, quand je vois du SQL qui utilise quelque chose comme:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Je remplace le where
par ceci:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
Est-il possible de faire la même chose avec l'inverse au cas où c'est un not in
(comme ci-dessous) au lieu d'une in
clause?
INSERT into Subscriptions(ProjectId, RecordTypeCID, NTID, Active, Added, LastUpdate, UpdateBy)
SELECT @ProjectId, RecordTypeCID, @NTID, 1, GETDATE(), GETDATE(), @NTID
FROM @Check CHK
WHERE CHK.ActiveStatus=1
And Not Exists (SELECT SubscriptionId FROM Subscriptions
WHERE ProjectId=@ProjectId
and NTID=@NTID
and RecordTypeCID = CHK.RecordTypeCID
)
Considérations supplémentaires
Puis-je faire ceci:
INSERT INTO Subscriptions(ProjectId, RecordTypeCID, NTID,Active, Added, LastUpdate, UpdateBy)
SELECT @ProjectId, RecordTypeCID, @NTID,1, GETDATE(), GETDATE(), @NTID
FROM @Check CHK
LEFT JOIN Subscriptions subs ON subs.RecordTypeCID = CHK.RecordTypeCID
AND NTID = @NTID
AND ProjectId = @ProjectId
AND CHK.ActiveStatus = 1
AND subs.SubscriptionId IS NULL
sql-server
sql-server-2005
except
kacalapy
la source
la source
Votre NOT EXISTS est plus efficace dans la plupart des cas.
LEFT JOIN fait correspondre en interne toutes les lignes, puis filtre sur IS NULL. PAS EXISTE non. Cette multiplication de lignes se produit également dans tout le code basé sur JOIN, vous aurez donc peut-être besoin d'un agrégat supplémentaire (DISTINCT) pour corriger la sortie
NOT IN est généralement faux car les valeurs NULL ne provoquent aucune correspondance.
Vous pouvez également utiliser EXCEPT qui donne le même plan que NOT EXISTS.
Pour info, selon la norme SQL-92 (page 191, cas 3a), le bit SELECT des EXISTS est ignoré.
la source