Normalmente, quando vejo o SQL que usa algo como:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Eu substituo o where
por este:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
É possível fazer o mesmo com o inverso, caso seja uma not in
(como abaixo) em vez de uma in
cláusula?
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
)
Considerações adicionais
Posso fazer isso:
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
fonte
fonte
Seu NOT EXISTS é mais eficiente na maioria dos casos.
LEFT JOIN combina internamente todas as linhas e depois filtra para IS NULL. NÃO EXISTE não. Essa multiplicação de linhas também acontece em todo o código baseado em JOIN, portanto, você pode precisar de um agregado extra (DISTINCT) para corrigir a saída
NOT IN geralmente está errado porque NULLs não causam nenhuma correspondência.
Você também pode usar EXCEPT, que fornece o mesmo plano que NOT EXISTS.
Para sua informação, de acordo com o padrão SQL-92 (página 191, Caso 3a), o bit SELECT dos EXISTS é ignorado.
fonte