Что случилось с *= и =* для внешних объединений в SQL?

#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 будет иметь атрибуты с отношениями для такого рода запросов и настоятельно рекомендует вам вообще избегать внешних соединений 😉