, (çok ve diğer sistemlerde) NOT IN
yüklem SQL Server
nasıl çalıştığı hakkında bloguma eski makalesi bağlantısı:
Aşağıdaki gibi yeniden yazabilirsiniz:
Bununla birlikte, çoğu veritabanları bu sorguları aynı şekilde ele alacaktır.
Bu iki sorgunun her ikisi de bir ANTI JOIN
türünü kullanacaktır.
SELECT *
FROM Orders o
WHERE (col1, col2) NOT IN
(
SELECT col1, col2
FROM HeldOrders ho
)
Not yolu o NULL
davranır nedeniyle NOT IN
zor olabileceğini, ancak,: Bu sözdizimini desteklemez SQL Server
beri iki veya daha fazla sütun kontrol etmek istiyorsanız
Bu
SQL Server
için yararlıdır değerler.
Held.Orders
null
, hiçbir kayıt bulunamadı ve alt sorgu döner ancak tek NULL
, bütün sorgu hiçbir şey (hem IN
ve NOT IN
bu durumda NULL
olarak değerlendirecektir) dönecektir.
Orders:
OrderID
---
1
HeldOrders:
OrderID
---
2
NULL
Bu sorgu:
SELECT *
FROM Orders o
WHERE OrderID NOT IN
(
SELECT OrderID
FROM HeldOrders ho
)
beklediğiniz değil muhtemelen şey, dönecektir
bu verileri göz önünde bulundurun. Ancak
, bu bir:
SELECT *
FROM Orders o
WHERE NOT EXISTS
(
SELECT NULL
FROM HeldOrders ho
WHERE ho.OrderID = o.OrderID
)
OrderID = 1
bulunduğu satırı dönecektir.
Başkaları tarafından önerilen LEFT JOIN
çözümlerinin en verimli çözüm olmaktan çok uzak olduğunu unutmayın.
Bu sorgu:
SELECT *
FROM Orders o
LEFT JOIN
HeldOrders ho
ON ho.OrderID = o.OrderID
WHERE ho.OrderID IS NULL
değerlendirilmesi ve Numerius olabilir satır uyan tüm filtrelemek için gereken bir filtre koşulu kullanır
hem IN
ve EXISTS
tarafından kullanılan bir ANTI JOIN
yöntem olacak Sadece, Orders
'daki her satır içinbir kaydın bulunmadığından emin olmanız gerekir, böylece ilk olarak tüm olası kopyaları ortadan kaldıracaktır: değerlendirirken 210
NESTED LOOPS ANTI JOIN
ve MERGE ANTI JOIN
sadece çiftleri atlayacak. HASH ANTI JOIN
A karma tablosu oluştururken kopyaları ortadan kaldırır.
En iyi yol çeşitli yaklaşımları denemek ve İcra Planlarını incelemektir. – pjp
Benim durumumda SQL Server 2000, söz konusu tablolarda indeksler verildiğinde "Birleştir" sorgusu en hızlıydı. kadar * SEC * SOL O siparişler GELEN o.Order_ID = h.Order_ID üzerinde HeldOrders h artır ve h.Order_ID Bu – Stimy