Как 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 строк.