Cóż, standard ANSI092 zawiera dość ohydną składnię. Połączenia naturalne to jedno, a klauzula USING to drugie. IMHO, dodanie kolumny do tabeli nie powinno zepsuć kodu, ale NATURALNE JOIN zepsuje się w najbardziej rażący sposób. „Najlepszym” sposobem na przerwanie jest błąd kompilacji. Na przykład, jeśli gdzieś wybierzesz *, dodanie kolumny możenie udało się skompilować. Następnym najlepszym sposobem na niepowodzenie byłby błąd czasu wykonywania. Jest gorzej, ponieważ Twoi użytkownicy mogą to zobaczyć, ale nadal daje ładne ostrzeżenie, że coś zepsułeś. Jeśli używasz ANSI92 i piszesz zapytania z łączeniami NATURAL, nie ulegnie on awarii w czasie kompilacji i nie ulegnie awarii w czasie wykonywania, zapytanie nagle zacznie dawać błędne wyniki. Tego typu błędy są podstępne. Raporty są błędne, potencjalne informacje finansowe są nieprawidłowe.
Dla tych, którzy nie są zaznajomieni z połączeniami NATURAL. Łączą dwie tabele w każdej nazwie kolumny, która istnieje w obu tabelach. Co jest naprawdę fajne, gdy masz 4-kolumnowy klucz i masz dość wpisywania go. Problem pojawia się, gdy Tabela1 ma wcześniej istniejącą kolumnę o nazwie DESCRIPTION i dodajesz nową kolumnę o nazwie Table2 o nazwie, och, nie wiem, coś nieszkodliwego, jak mmm, DESCRIPTION, a teraz dołączasz do dwóch tabel na VARCHAR2 (1000) pole o dowolnym kształcie.
Klauzula USING może prowadzić do całkowitej niejednoznaczności oprócz problemu opisanego powyżej. W innym poście SO ktoś pokazał ten ANSI-92 SQL i poprosił o pomoc w jego czytaniu.
SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123
To jest całkowicie niejednoznaczne. Umieściłem kolumnę UserID w tabelach firm i użytkowników i nie ma żadnych skarg. Co się stanie, jeśli kolumna ID użytkownika w firmach jest identyfikatorem ostatniej osoby, która zmodyfikowała ten wiersz?
Mówię poważnie, czy ktoś może wyjaśnić, dlaczego taka dwuznaczność była konieczna? Dlaczego jest wbudowany bezpośrednio w standard?
Myślę, że Bill ma rację, że istnieje duża baza programistów, którzy kopiują / wklejają tam przez kodowanie. Prawdę mówiąc, mogę przyznać, że jestem taki, jeśli chodzi o ANSI-92. Każdy przykład, jaki kiedykolwiek widziałem, pokazywał, że wiele złączeń jest zagnieżdżonych w nawiasach. Szczerość, która sprawia, że wybieranie stolików w sql jest w najlepszym razie trudne. Ale potem ewangilista SQL92 wyjaśnił, że faktycznie wymusiłoby to kolejność łączenia. JEZUS ... wszyscy ci kopiący pasterze, których widziałem, wymuszają teraz polecenie łączenia - zadanie, które w 95% przypadków lepiej pozostawić optymalizatorom, zwłaszcza kopiowaniu / pasterowi.
Tomalak dobrze zrozumiał, kiedy powiedział:
ludzie nie przechodzą na nową składnię tylko dlatego, że ona istnieje
To musi mi coś dać i nie widzę korzyści. A jeśli jest plus, negatywy to albatros zbyt duży, aby je zignorować.