Stara składnia, zawierająca tylko listę tabel i wykorzystująca WHERE
klauzulę do określenia kryteriów łączenia, jest przestarzała w większości nowoczesnych baz danych.
Nie chodzi tylko o pokaz, stara składnia może być dwuznaczna, gdy użyjesz złączeń INNER i OUTER w tym samym zapytaniu.
Dam ci przykład.
Załóżmy, że masz w systemie 3 tabele:
Company
Department
Employee
Każda tabela zawiera wiele wierszy połączonych ze sobą. Masz wiele firm i każda firma może mieć wiele działów, a każdy dział może mieć wielu pracowników.
Ok, teraz chcesz wykonać następujące czynności:
Wymień wszystkie firmy i wszystkie ich działy oraz wszystkich ich pracowników. Pamiętaj, że niektóre firmy nie mają jeszcze żadnych działów, ale pamiętaj o ich uwzględnieniu. Upewnij się, że pobierasz tylko te działy, które mają pracowników, ale zawsze wymieniasz wszystkie firmy.
Więc robisz to:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
Zwróć uwagę, że ostatnia jest łączenie wewnętrzne, aby spełnić kryteria, że chcesz tylko działy z ludźmi.
Ok, więc co się teraz stanie. Problem polega na tym, że zależy to od silnika bazy danych, optymalizatora zapytań, indeksów i statystyk tabeli. Pozwól mi wyjaśnić.
Jeśli optymalizator zapytań ustali, że sposobem na to jest najpierw zabranie firmy, a następnie znalezienie działów, a następnie połączenie wewnętrzne z pracownikami, nie uzyskasz żadnych firm, które nie mają działów.
Powodem tego jest to, że WHERE
klauzula określa, które wiersze kończą w wyniku końcowym, a nie poszczególne części wierszy.
W tym przypadku, ze względu na lewe łączenie, kolumna Department.ID będzie miała wartość NULL, a zatem jeśli chodzi o INNER JOIN to Employee, nie ma sposobu, aby spełnić to ograniczenie dla wiersza Employee, a więc nie będzie zjawić się.
Z drugiej strony, jeśli optymalizator zapytań zdecyduje się najpierw rozwiązać dołączenie do pracownika działu, a następnie wykonać lewe połączenie z firmami, zobaczysz je.
Tak więc stara składnia jest niejednoznaczna. Nie ma sposobu, aby określić, co chcesz, bez radzenia sobie ze wskazówkami dotyczącymi zapytań, a niektóre bazy danych nie mają żadnej możliwości.
Wprowadź nową składnię, z tym możesz wybrać.
Na przykład, jeśli chcesz, aby wszystkie firmy, jak podano w opisie problemu, napisałbyś to:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
W tym miejscu określasz, że chcesz, aby łączenie pracownika działu było wykonywane jako jedno połączenie, a następnie pozostawienie dołączenia wyników tego połączenia do firm.
Dodatkowo, powiedzmy, że chcesz tylko działów, które zawierają literę X w ich nazwie. Ponownie, przy sprzężeniach w starym stylu, ryzykujesz również utratę firmy, jeśli nie ma żadnych działów z X w nazwie, ale dzięki nowej składni możesz to zrobić:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
Ta dodatkowa klauzula służy do łączenia, ale nie jest filtrem dla całego wiersza. Tak więc wiersz może pojawiać się z informacjami o firmie, ale może mieć wartości NULL we wszystkich kolumnach działu i pracownika dla tego wiersza, ponieważ nie ma działu o nazwie X dla tej firmy. Jest to trudne przy starej składni.
To dlatego, między innymi dostawcami, Microsoft wycofał starą zewnętrzną składnię złączeń, ale nie starą wewnętrzną składnię złączeń, od SQL Server 2005 i wyższych. Jedynym sposobem na rozmowę z bazą danych działającą na Microsoft SQL Server 2005 lub 2008, przy użyciu składni sprzężenia zewnętrznego w starym stylu, jest ustawienie tej bazy danych w trybie zgodności 8.0 (inaczej SQL Server 2000).
Dodatkowo, stary sposób, rzucając kilka tabel w optymalizator zapytań, z kilkoma klauzulami WHERE, był podobny do powiedzenia „proszę bardzo, zrób co możesz”. Dzięki nowej składni optymalizator zapytań ma mniej pracy, aby dowiedzieć się, które części idą w parze.
Więc masz to.
POŁĄCZENIE W LEWO i WEWNĘTRZNE to fala przyszłości.