Słyszałem, że połączenia powinny być preferowane w stosunku do zagnieżdżonych zapytań. Czy to prawda w ogóle?
To zależy od wymagań i danych.
Używanie JOIN ryzykuje powielenie informacji w zestawie wyników dla tabeli nadrzędnej, jeśli istnieje więcej niż jeden rekord potomny z nim związany, ponieważ JOIN zwraca wiersze, które są zgodne. Co oznacza, że jeśli chcesz używać unikatowych wartości z tabeli nadrzędnej podczas korzystania z powiązań JOIN, musisz rozważyć użycie klauzuli DISTINCT
lub GROUP BY
. Ale nic z tego nie jest problemem, jeśli używane jest podzapytanie.
Ponadto podkwerendy nie są takie same. Nie ma prostej oceny, jak Twój przykład:
where emp.id = (select s.id from sap s where s.id = 111)
... a klauzula:
where emp.id IN (select s.id from sap s where s.id = 111)
... który będzie pasował do żadnej z wartości (S) zwracany przez podzapytanie, gdy prosta ocena spowoduje błąd, jeśli s.id
zwróci więcej niż jedną wartość. Ale jest też klauzula EXISTS
...
WHERE EXISTS(SELECT NULL
FROM SAP s
WHERE emp.id = s.id
AND s.id = 111)
EXISTS różni się tym, że:
- klauzuli SELECT nie zostanie oceniony - można go zmienić na
SELECT 1/0
, który powinien wyzwalania błąd dzielenia przez zero, ale nie będzie zwracał wartości true/false; prawda jest oparta na pierwszym przypadku, gdy kryteria są spełnione, więc jest szybszy w przypadku duplikatów.
- w przeciwieństwie do klauzuli IN, EXISTS obsługuje porównywanie dwóch lub więcej porównań kolumn w tym samym czasie, ale niektóre bazy danych obsługują porównanie krotek z IN.
- jest bardziej czytelny
A co z tym, że warunek miejsca jest częścią warunku łączenia? INNER JOIN sap s na emp.id = s.id i s.id = 111 – Tim