Вы заявили о своей заинтересованности в «внутренностях», а затем задали пример, иллюстрирующий «семантику». Я отвечаю на семантику.
Рассмотрим эти таблицы.
Table1 : 1, 4, 6
Table2 : 2, 4, 5
Table3 : 3, 5, 6
В обоих примерах сначала выполняется одно и то же соединение, поэтому я выполню это здесь.
FirstResult = T1 FULL JOIN T2 : (T1, T2)
(1, null)
(4, 4)
(6, null)
(null, 2)
(null, 5)
Пример (А)
FirstResult FULL JOIN T3 ON FirstItem : (T1, T2, T3)
(1, null, null)
(4, 4, null)
(6, null, 6) <----
(null, 2, null)
(null, 5, null) <----
(null, null, 3)
Пример (B)
FirstResult FULL JOIN T3 ON SecondItem : (T1, T2, T3)
(1, null, null)
(4, 4, null)
(6, null, null) <----
(null, 2, null)
(null, 5, 5) <----
(null, null, 3)
Здесь показано, как логически получить результаты из объединений.
Для "внутренних объектов" есть нечто, называемое оптимизатором запросов, которое будет давать те же результаты, но оно сделает выбор реализации для быстрого выполнения вычислений / ввода-вывода. Эти выборы включают в себя:
- к каким таблицам обращаться в первую очередь
- просмотр таблицы с использованием индекса или сканирования таблицы
- который объединяет используемый тип реализации (вложенный цикл, слияние, хеш).
Также обратите внимание: из-за того, что оптимизатор делает эти выборы и изменяет их в зависимости от того, что он считает оптимальным, порядок результатов может измениться. Порядок результатов по умолчанию всегда "самый простой". Если вы не хотите использовать порядок по умолчанию, вам нужно указать порядок в запросе.
Чтобы точно узнать, что оптимизатор будет делать с запросом (в тот момент, когда он может изменить свое решение), вам нужно просмотреть план выполнения.