Na początek link do starego artykułu na moim blogu na jak NOT IN
orzecznik działa w SQL Server
(iw innych układach zbyt):
Możesz przepisać go w następujący sposób:
SELECT *
FROM Orders o
WHERE NOT EXISTS
(
SELECT NULL
FROM HeldOrders ho
WHERE ho.OrderID = o.OrderID
)
, jednak większość baz danych będzie traktować te zapytania w taki sam sposób.
Oba te zapytania będą używać pewnego rodzaju ANTI JOIN
.
Jest to przydatne dla SQL Server
jeśli chcesz sprawdzić dwie lub więcej kolumn, ponieważ SQL Server
nie obsługuje tej składni:
SELECT *
FROM Orders o
WHERE (col1, col2) NOT IN
(
SELECT col1, col2
FROM HeldOrders ho
)
jednak pamiętać, że NOT IN
może być trudne ze względu na sposób, w jaki traktuje NULL
wartości.
Jeśli Held.Orders
jest pustych, żadne zapisy znajdują się i powraca podzapytanie tylko jeden NULL
cała kwerenda zwróci nic (zarówno IN
i NOT IN
oceni do NULL
w tym przypadku).
Rozważmy te dane:
Orders:
OrderID
---
1
HeldOrders:
OrderID
---
2
NULL
tego zapytania:
SELECT *
FROM Orders o
WHERE OrderID NOT IN
(
SELECT OrderID
FROM HeldOrders ho
)
powróci nic, który prawdopodobnie nie jest to, czego można oczekiwać.
Jednakże tego:
SELECT *
FROM Orders o
WHERE NOT EXISTS
(
SELECT NULL
FROM HeldOrders ho
WHERE ho.OrderID = o.OrderID
)
powróci wierszach OrderID = 1
.
Należy pamiętać, że rozwiązania proponowane przez innych użytkowników nie są najskuteczniejszym rozwiązaniem.
To zapytanie:
SELECT *
FROM Orders o
LEFT JOIN
HeldOrders ho
ON ho.OrderID = o.OrderID
WHERE ho.OrderID IS NULL
użyje warunek filtru, które będą potrzebne do oceny i odfiltrować wszystkie dopasowanie wiersze, które mogą być numerius
ANTI JOIN
metoda stosowana zarówno przez IN
i EXISTS
będzie wystarczy upewnić się, że rekord nie istnieje po dla każdego wiersza w Orders
, więc najpierw wyeliminuje wszystkie możliwe duplikaty:
NESTED LOOPS ANTI JOIN
i MERGE ANTI JOIN
po prostu pominie duplikaty podczas oceny HeldOrders
.
- A
HASH ANTI JOIN
wyeliminuje duplikaty podczas budowania tabeli skrótów.
Najlepszym sposobem jest wypróbowanie różnych podejść i zbadanie planów wykonania. – pjp
W mojej sytuacji SQL Server 2000, biorąc pod uwagę indeksy w tabelach, zapytanie "Dołącz" było najszybsze. SELECT * zleceń ö lewo Dołącz HeldOrders h na o.Order_ID = h.Order_ID i h.Order_ID jest zerowy – Stimy