Ну, стандарт ANSI092 включает в себя довольно отвратительный синтаксис. Natural Joins - это одно, а пункт USING - другое. ИМХО, добавление столбца в таблицу не должно нарушать код, но НАТУРАЛЬНОЕ СОЕДИНЕНИЕ прерывается самым вопиющим образом. «Лучший» способ - это ошибка компиляции. Например, если вы SELECT * где-то, добавление столбца может не скомпилироваться. Следующим лучшим способом сбоя будет ошибка времени выполнения. Это хуже, потому что ваши пользователи могут видеть это, но это все равно дает вам хорошее предупреждение, что вы что-то сломали. Если вы используете ANSI92 и пишете запросы с естественными объединениями, он не будет прерываться во время компиляции и не будет прерываться во время выполнения, запрос просто внезапно начнет давать неправильные результаты. Эти типы ошибок коварны. Отчеты идут неправильно, возможно, финансовое раскрытие неверно.
Для тех, кто не знаком с ЕСТЕСТВЕННЫМИ объединениями. Они объединяют две таблицы в каждом имени столбца, которое существует в обеих таблицах. Что действительно здорово, когда у вас есть 4-колоночный ключ, и вы устали его набирать. Проблема возникает, когда в Table1 есть уже существующий столбец с именем DESCRIPTION, и вы добавляете новый столбец с именем Table2, о, я не знаю, что-то безобидное, например, mmm, DESCRIPTION, и теперь вы объединяете две таблицы в VARCHAR2. (1000) поле в свободной форме.
Предложение USING может привести к полной неоднозначности в дополнение к проблеме, описанной выше. В другом SO сообщении кто-то показал этот ANSI-92 SQL и попросил помощи в его чтении.
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
Это совершенно неоднозначно. Я поместил столбец UserID в таблицы Companies и user, и жалоб нет. Что если столбец UserID в компаниях является идентификатором последнего человека, который изменил эту строку?
Я серьезно, кто-нибудь может объяснить, почему такая двусмысленность была необходима? Почему он встроен прямо в стандарт?
Я думаю, что Билл прав, что есть большая база разработчиков, которые копируют / вставляют туда через кодирование. На самом деле, я могу признать, что я вроде как один, когда дело доходит до ANSI-92. Каждый пример, который я когда-либо видел, показывал множественные объединения, вложенные в скобки. Честность, которая в лучшем случае затрудняет выбор таблиц в SQL. Но затем евангелист SQL92 объяснил, что на самом деле навязывает порядок соединения. ИИСУС ... все те копировщики, которых я видел, теперь навязывают порядок соединения - работу, которая в 95% случаев лучше оставить оптимизаторам , особенно копия / пастер.
Томалак понял это правильно, когда сказал:
люди не переключаются на новый синтаксис просто
потому что это там
Это должно мне что-то дать, и я не вижу ничего хорошего. А если есть потенциал, негативы - это слишком большой альбатрос, чтобы его игнорировать.