Biasanya ketika saya melihat SQL yang menggunakan sesuatu seperti:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Saya ganti where
dengan ini:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
Apakah mungkin untuk melakukan hal yang sama dengan invers jika ini adalah not in
(seperti di bawah) daripada in
klausa?
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
)
Pertimbangan tambahan
Bisakah saya melakukan ini:
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
sumber
sumber
Anda TIDAK ADA lebih efisien dalam banyak kasus.
LEFT JOIN secara internal mencocokkan semua baris lalu memfilter ke IS NULL. BUKAN ADA tidak. Perkalian baris ini juga terjadi di semua kode berbasis GABUNG sehingga Anda mungkin memerlukan agregat tambahan (DISTINCT) untuk memperbaiki output
BUKAN DI umumnya salah karena NULL tidak menyebabkan kecocokan.
Anda juga dapat menggunakan KECUALI yang memberikan paket yang sama dengan BUKAN ADA.
FYI, sesuai standar SQL-92 (halaman 191, Kasus 3a) bit SELECT dari EXISTS diabaikan.
sumber