#sql #operators #obsolete
#sql #операторы #устаревший
Вопрос:
Мне было просто любопытно, почему *=
operator for left outer join
и ‘=*’ for ‘ правое внешнее соединение были исключены из стандарта SQL или, по крайней мере, не поддерживаются SQL server 2005 и далее? Я прочитал несколько других сообщений об этом конкретном операторе и понимаю, что это может дать некоторые неожиданные результаты. Но если бы это было семантически эквивалентно, я бы подумал, что это был бы более простой оператор для использования при необходимости объединения нескольких таблиц. Во всяком случае, я бы предпочел использовать этот оператор для динамического создания SQL-запросов, а не пытаться получить правильный порядок слов, например:
FROM accounts
LEFT OUTER JOIN customers
ON accounts.accountnum = customers.accountnum
LEFT OUTER JOIN products
ON customers.accountnum = products.accountnum
AND customers.id = products.customerid
где
FROM accounts, customers, products
WHERE accounts.accountnum *= customers.accountnum AND
customers.accountnum *= products.accountnum AND
customers.id *= products.customer.id
казалось бы, было бы проще анализировать вместе.
Но вернемся к реальному миру, какова была идея для этих операторов, если они не выполняют «истинное» внешнее соединение?Термин «Короткая рука» подразумевает, что он должен делать точно то же самое, но, очевидно, не в этом случае.
Комментарии:
1. Можете ли вы предоставить ссылку на их использование? Я никогда не слышал об этих операторах. Как минимум, я бы сказал, что они чувствуют себя слишком зрелыми, чтобы вызывать путаницу из-за возможных опечаток…
2. @X-Zero: очень распространенный не так давно, скажем, десять лет. В то время поддержка SQL-92 была ограничена, и существует много устаревшего кода, который использует этот синтаксис соединения.
3. Я уверен, что версии Oracle поддерживали этот синтаксис в течение длительного времени…
4. Я предпочитаю первый стиль — стандартный стиль ANSI — объединений. Почему?? С «устаревшим» стилем разделения нескольких таблиц только запятыми вы (1) рискуете пропустить условие СОЕДИНЕНИЯ, что приведет к нежелательному декартову произведению (и значительно увеличит количество возвращаемых строк) и (2) загромождаете свое предложение WHERE условиями соединения, поэтомуу вас беспорядочная сборка условия соединения и фактических условий WHERE . Стиль ANSI с явными объединениями и их условиями ОБЪЕДИНЕНИЯ намного приятнее и понятнее.
Ответ №1:
SQL Server MVP K. Брайан Келли хорошо объясняет это здесь: почему SQL Server 2005 не разрешает ВНЕШНИЕ соединения, отличные от ANSI
Ответ №2:
Я не думаю, что они были исключены из стандарта. Я думаю, что они никогда не были в этом. Они были просто соглашением, которому следовали поставщики, пока не вышел SQL-92, и поставщики решили, что его стоит внедрить.
Ответ №3:
Выполните поиск в Google для статьи Криса Дейта «Внешнее соединение без нулей и с меньшим количеством разрывов», которая предшествует стандарту SQL-92. Хотя я не смог найти бесплатную копию в Интернете, я нашел документ, в котором анализируется статья и дается хорошая история внешних соединений в SQL. Обратите внимание, что в настоящее время Date будет иметь атрибуты с отношениями для такого рода запросов и настоятельно рекомендует вам вообще избегать внешних соединений 😉