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