2015-09-17 3 views
0

При выполнении внешнего соединения, является ли это порядок таблиц, которые имеют значение, или порядок предложения ON?SQL Server Outer присоединяется

Для примера

FROM TABLEA A 
LEFT JOIN TABLEB B ON A.id = B.id 

же, как

FROM TABLEA A 
LEFT JOIN TABLEB B ON B.id = A.id 

А что если у вас есть несколько таблиц? Является ли это LEFT JOIN, если первая таблица из многих - это то, что вы хотите, чтобы все строки были независимо от предложения ON?

Например,

FROM TABLEA A 
LEFT JOIN TABLEB B ON A.id = B.id 
LEFT JOIN TABLEC C ON C.ID = A.ID 

это Несет ли все строки из TABLEA, потому что он находится слева в списке таблицы или строки из C, потому что он находится на левой в пункте ON?

+1

заказ таблицы – wiretext

+3

порядок таблиц вопрос, порядок элементов в ON не – Lanorkin

+1

Когда вы проверили это перед тем, как спросить, было ли что-то двусмысленное о результатах, которые вы не поняли? –

ответ

1

LEFT JOIN означает взять таблицу слева (первая указанная) и соединить строки из таблицы справа (вторая указана). Он присоединяется к ним, основываясь на условии ON: true. Поскольку условие ON просто должно быть true, то, как он написан, не имеет значения, это просто выражение, которое оценивается.

LEFT JOIN гарантирует, что каждая строка из таблицы слева сохраняется и соединяется с NULL с, если нет строки для присоединения к ней из таблицы справа. Это означает, что порядок таблиц, безусловно, значителен.

Если порядок таблиц был отменен, и было всего две таблицы, то RIGHT JOIN имел бы тот же эффект (т. Е. Сохранил строки из указанной второй таблицы).

+0

Но налево не обязательно означает сразу же влево, если есть несколько таблиц, правильно?Как и в моем примере 3 таблицы TableA находится слева от TableC, но не сразу – user1612851

+0

@ user1921849 Это в основном правильно, но вы можете подумать об этом странно. Каждый JOIN основывается на том, какие таблицы уже были «объединены» ранее, поэтому каждый JOIN всегда имеет таблицу слева (указанную вначале) и таблицу справа (указанную секунду). Если я скажу: «Левое соединение B слева присоединяется к C», это то же самое, что и «(левое соединение B) слева присоединяется к C», где сначала создается «A join join B», затем C соединяется дальше. Таким образом, второй LEFT JOIN имеет комбинированную таблицу AB слева, а C - справа. Имеют смысл? –

0
FROM TABLEA A LEFT JOIN TABLEB B ON A.id=B.id LEFT JOIN TABLEC C ON C.ID=A.ID 

FROM TABLEA A LEFT JOIN TABLEB B ON B.id=A.id LEFT JOIN TABLEC C ON A.ID=C.ID 

Они оба вернут те же результаты.

FROM TABLEA A LEFT JOIN TABLEB B ON B.id=A.id LEFT JOIN TABLEC C ON B.ID=C.ID 

Это может или не может возвращать одинаковые результаты в зависимости от того, что данные на самом деле в таблице б и таблицы C, так как таблица C связана с таблицей б не имеет прямого отношения к таблице A. Лично я всегда относиться к этому как будучи по-разному по определению, чем первый набор объединений, и что если это то же, что случайно в этот момент времени.

При написании нескольких объединений, особенно когда у вас есть внешние соединения, я лично считаю полезным сначала начать с родительской таблицы (которая обычно является той, которую вы хотите в левой части соединения), и добавить любое другое другое внутреннее соединение таблицы перед выполнением левых объединений. Если у меня есть таблицы для детей и внуков (несколько временных дочерних таблиц), я пытаюсь сделать в порядке убывания родительского, дочернего, внучатого, чтобы было ясно, что связано с чем.

Смежные вопросы