Синтаксис подсоединения SQL

При использовании вспомогательного соединения я заметил два разных способа получения одинаковых результатов. Внутри подсоединения используется «выбор» для объединения двух таблиц, а затем присваивается псевдоним, на который ссылаются в последующих строках. Другой просто объединяет две таблицы «анонимно», а в последующих строках используются псевдонимы таблиц Sub-Join. У меня есть пример кода ниже. Мои вопросы:

  1. Это эквивалентно и одно только сохраняет нажатия клавиш?

  2. Создает ли один, использующий select, временную таблицу, а другой - нет?

  3. Будет ли разница в производительности между ними? Не думаю, что будет на основе анализатора исполнения, но подумал, что спрошу.

  4. Есть ли «имя» для одного или других «стиля подчиненного соединения» (например, подчиненное присоединение с псевдонимом или анонимное подчиненное соединение?)

  5. Что касается правил области видимости псевдонимов таблиц и столбцов, есть ли какие-нибудь хорошие документы, на которые кто-то мог бы указать мне, которые могли бы объяснить подобные ситуации? Я искал и не могу найти ничего подходящего (хотя я не уверен, что ищу «правильно»)?

Вот два запроса:

SELECT bp1.*, b1.* 
from Bugs b1 
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id
LEFT OUTER JOIN (select b2.*, bp2.product_id 
                from Bugs b2 
                JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id) AS sub1
ON (bp1.product_id = sub1.product_id AND (b1.date_reported < sub1.date_reported))
WHERE sub1.bug_id IS NULL;

SELECT bp1.*, b1.* 
from Bugs b1 
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id
LEFT OUTER JOIN (Bugs b2 JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id)
ON (bp1.product_id = bp2.product_id AND (b1.date_reported < b2.date_reported))
WHERE b2.bug_id IS NULL;

person steve    schedule 22.02.2013    source источник


Ответы (2)


Я исследовал эту тему дальше и нашел ответы, которые искал. Надеюсь, это поможет кому-то еще в будущем.

При выполнении JOIN для «подзапроса», как и в первом случае, вы должны указать псевдоним для подзапроса и, следовательно, должны использовать этот псевдоним при обращении к данным из этого подзапроса. ПРИСОЕДИНЕНИЕ к подзапросу дает вам более подробный контроль над тем, какие поля будут возвращены, как они отформатированы и т. Д., Так что это может быть предпочтительнее в некоторых случаях, когда вам нужно «настроить» данные. Данные, возвращаемые подобным подзапросом, могут называться, среди прочего, «виртуальной таблицей» или «производной таблицей».

Второй случай в моем примере - это просто «Mutli-Join». В этом нет ничего особенного. Это требует меньше ввода и может быть предпочтительнее, когда настройка полей возврата не требуется.

Оба запроса производят идентичные пути выполнения в моей среде. YMMV.

Вот хорошая статья, в которой объясняются подзапросы и объединения (среди других тем о подзапросах) для более полного описания: https://www.simple-talk.com/sql/sql-training/subqueries-in-sql-server/

person steve    schedule 26.02.2013

Не могли бы вы просто использовать это? :

SELECT bp1.*, b1.* 
FROM bugs b1, bugsproducts bp1 
WHERE b1.bug_id = bp1.bug_id AND b1.bug_is IS NULL

Поскольку псевдоним кажется мне проще и намного чище и короче код

и что должно

(b1.date_reported < b2.date_reported)

return, isnt b1 = Ошибки и b2 = Ошибки, поэтому та же таблица

person JohnZ    schedule 22.02.2013
comment
Спасибо, Джон, но мой вопрос не в том, как заставить запрос работать. В основном вопрос заключается в том, «в чем разница между двумя запросами?» Я пытаюсь понять, почему один стиль запроса лучше другого (если он вообще есть). - person steve; 23.02.2013