Típicamente cuando veo SQL que usa algo como:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Reemplazo el where
con esto:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
¿Es posible hacer lo mismo con el inverso en caso de que sea un not in
(como a continuación) en lugar de una 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
)
Consideraciones adicionales
Puedo hacer esto:
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
fuente
fuente
Su NO EXISTE es más eficiente en la mayoría de los casos.
IZQUIERDA UNIR internamente coincide con todas las filas y luego filtra a IS NULL. NO EXISTE no lo hace. Esta multiplicación de filas también ocurre en todos los códigos basados en JOIN, por lo que puede necesitar un agregado adicional (DISTINCT) para corregir la salida
NOT IN generalmente es incorrecto porque los NULL no causan coincidencia.
También puede usar EXCEPTO que proporciona el mismo plan que NO EXISTE.
Para su información, según el estándar SQL-92 (página 191, caso 3a), se ignora el bit SELECT de EXISTS.
fuente