Wenn ich SQL sehe, das normalerweise Folgendes verwendet:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Ich ersetze das where
durch:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
Ist es möglich, dasselbe mit der Umkehrung zu tun, wenn es sich um eine not in
(wie unten) anstelle einer in
Klausel handelt?
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
)
Weitere Überlegungen
Kann ich das tun:
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
Kakalapy
quelle
quelle
Ihr NOT EXISTS ist in den meisten Fällen effizienter.
LEFT JOIN stimmt intern mit allen Zeilen überein und filtert dann nach IS NULL. NICHT EXISTIERT nicht. Diese Zeilenmultiplikation findet auch in allen JOIN-basierten Codes statt, sodass Sie möglicherweise ein zusätzliches Aggregat (DISTINCT) benötigen, um die Ausgabe zu korrigieren
NOT IN ist im Allgemeinen falsch, da NULL-Werte keine Übereinstimmung verursachen.
Sie können auch EXCEPT verwenden, das den gleichen Plan wie NOT EXISTS enthält.
Zu Ihrer Information , gemäß dem SQL-92-Standard (Seite 191, Fall 3a) wird das SELECT-Bit der EXISTS ignoriert.
quelle