Как LEFT OUTER JOIN возвращает больше записей, чем существует в левой таблице?
У меня есть очень простой LEFT OUTER JOIN, который возвращает все результаты из левой таблицы и дополнительную информацию из гораздо более крупной таблицы. Левая таблица содержит 4935 записей, но когда я LEFT OUTER JOIN его в дополнительную таблицу, количество записей значительно больше.
Насколько мне известно, абсолютное Евангелие - это то, что LEFT OUTER JOIN вернет все записи из левой таблицы с сопоставленными записями из правой таблицы и нулевыми значениями для любых строк, которые невозможно сопоставить, поэтому я понимаю что было бы невозможно вернуть больше строк, чем есть в левой таблице, но все равно это происходит!
SQL Query следует:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits LEFT OUTER JOIN
DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
Возможно, я допустил ошибку в синтаксисе, или мое понимание LEFT OUTER JOIN является неполным, какова бы ни была причина, по которой я сошел с ума здесь, надеюсь, кто-то может объяснить, как это может произойти?
Postscript
Спасибо за ответы grea, мое понимание LEFT OUTER JOINS теперь намного лучше, может ли кто-нибудь предложить способ, чтобы этот запрос мог быть изменен, так что я получаю столько записей, сколько существует в левой таблице?
Этот запрос предназначен исключительно для генерации отчета, а дубликаты совпадений просто путают вопросы.
/Postscript
Ответы
Ответ 1
LEFT OUTER JOIN вернет все записи из таблицы LEFT, соединенной с таблицей RIGHT, где это возможно.
Если есть совпадения, он все равно вернет все строки, которые соответствуют, поэтому одна строка в LEFT, которая соответствует двум строкам в RIGHT, вернется как два ROWS, как INNER JOIN.
EDIT:
В ответ на ваше редактирование я только что просмотрел ваш запрос, и похоже, что вы только возвращаете данные из таблицы LEFT. Поэтому, если вам нужны только данные из таблицы LEFT, и вам нужна только одна строка, возвращаемая для каждой строки в таблице LEFT, тогда вам вообще не нужно выполнять JOIN, и вы можете просто сделать SELECT непосредственно из таблицы LEFT.
Ответ 2
Table1 Table2
_______ _________
1 2
2 2
3 5
4 6
SELECT Table1.Id, Table2.Id FROM Table1 LEFT OUTER JOIN Table2 ON Table1.Id=Table2.Id
Результаты:
1,null
2,2
2,2
3,null
4,null
Ответ 3
Это не невозможно. Количество записей в левой таблице - это минимальное количество записей, которые он будет возвращать. Если в правой таблице есть две записи, соответствующие одной записи в левой таблице, она вернет две записи.
Ответ 4
В ответ на ваш постскрипт, это зависит от того, что вы хотели бы.
Вы получаете (возможно) несколько строк для каждой строки в левой таблице, потому что для условия соединения есть несколько совпадений. Если вы хотите, чтобы ваши итоговые результаты имели то же количество строк, что и в левой части запроса, вам нужно убедиться, что ваши условия соединения вызывают соответствие 1 к 1.
В качестве альтернативы, в зависимости от того, что вы действительно хотите, вы можете использовать агрегированные функции (если, например, вы просто хотите, чтобы строка из правой части вы могли создать столбец, который представляет собой строку с разделителями-запятыми из правой части для этой левой строки.
Если вы просматриваете только 1 или 2 столбца из внешнего соединения, вы можете использовать скалярный подзапрос, так как вам будет гарантирован 1 результат.
Ответ 5
Каждая запись из левой таблицы будет возвращена столько раз, сколько есть соответствующих записей в правой таблице - по крайней мере 1, но может быть легко больше 1.
Ответ 6
LEFT OUTER JOIN, как INNER JOIN (нормальное соединение), вернет столько результатов для каждой строки в левой таблице, сколько совпадений, которые она найдет в правой таблице. Следовательно, вы можете получить много результатов - до N x M, где N - количество строк в левой таблице, а M - количество строк в правой таблице.
Минимальное количество результатов всегда гарантируется в LEFT OUTER JOIN как минимум N.
Ответ 7
Может ли это быть отношением друг к другу между левой и правой таблицами?
Ответ 8
Обратите внимание, если у вас есть предложение where в таблице "right side" запроса, содержащего левое внешнее соединение...
Если у вас нет записи с правой стороны, удовлетворяющей условию where, тогда соответствующая запись таблицы "слева" не будет отображаться в результате вашего запроса....
Ответ 9
Если вам нужна только одна строка с правой стороны
SELECT SuspReason, SiteID FROM(
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID, ROW_NUMBER()
OVER(PARTITION BY SUSP.Susp_Visits.SiteID) AS rn
FROM SUSP.Susp_Visits
LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
) AS t
WHERE rn=1
или просто
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits WHERE EXISTS(
SELECT DATA.Dim_Member WHERE SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
)
Ответ 10
Кажется, что есть несколько строк в таблице DATA.Dim_Member в строке SUSP.Susp_Visits.
Ответ 11
если несколько (x) строк в Dim_Member связаны с одной строкой в Susp_Visits, в наборе resul будет указано x строк.