У меня есть очень простой LEFT OUTER JOIN, чтобы вернуть все результаты из левой таблицы и некоторую дополнительную информацию из гораздо большей таблицы. Левая таблица содержит 4935 записей, но когда я оставляю ее в другой таблице, количество записей значительно увеличивается.
Насколько я знаю, это абсолютное Евангелие, что LEFT OUTER JOIN вернет все записи из левой таблицы с совпадающими записями из правой таблицы и нулевые значения для любых строк, которые не могут быть сопоставлены, так как я понимаю, что это должно невозможно вернуть больше строк, чем существует в левой таблице, но все происходит одинаково!
SQL-запрос следует:
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 неполное, надеюсь, кто-то может объяснить, как это могло произойти?
постскриптум
Спасибо за отличные ответы, мое понимание LEFT OUTER JOINS теперь намного лучше, может ли кто-нибудь предложить способ, которым этот запрос может быть изменен так, чтобы я получал только столько возвращаемых записей, сколько существует в левой таблице?
Этот запрос предназначен исключительно для генерации отчета, а повторяющиеся совпадения просто запутывают вопросы.
/ Postscript
источник
Ответы:
LEFT OUTER JOIN вернет все записи из таблицы LEFT, объединенной с таблицей RIGHT, где это возможно.
Если есть совпадения, он по-прежнему будет возвращать все соответствующие строки, поэтому одна строка в LEFT, соответствующая двум строкам в RIGHT, будет возвращаться как две строки, как INNER JOIN.
РЕДАКТИРОВАТЬ: В ответ на ваши изменения, я только что еще раз рассмотрел ваш запрос, и похоже, что вы только возвращаете данные из таблицы LEFT. Поэтому, если вам нужны только данные из таблицы LEFT, и вы хотите, чтобы для каждой строки в таблице LEFT возвращалась только одна строка, тогда вам вообще не нужно выполнять JOIN и вы можете просто выполнить SELECT непосредственно из таблицы LEFT.
источник
Полученные результаты:
источник
Это не невозможно Количество записей в левой таблице - это минимальное количество записей, которое он вернет. Если в правой таблице есть две записи, соответствующие одной записи в левой таблице, она вернет две записи.
источник
В ответ на ваш постскриптум, это зависит от того, что вы хотели бы.
Вы получаете (возможно) несколько строк для каждой строки в левой таблице, потому что есть несколько совпадений для условия соединения. Если вы хотите, чтобы ваши итоговые результаты имели то же количество строк, что и в левой части запроса, вам нужно убедиться, что ваши условия объединения вызывают совпадение 1: 1.
В качестве альтернативы, в зависимости от того, что вы на самом деле хотите, вы можете использовать агрегатные функции (например, если вы просто хотите получить строку из правой части, вы можете сгенерировать столбец, представляющий собой строку с разделителями-запятыми правой стороны, для этой левой строки.
Если вы просматриваете только 1 или 2 столбца из внешнего соединения, вы можете рассмотреть возможность использования скалярного подзапроса, поскольку вам гарантирован 1 результат.
источник
Каждая запись из левой таблицы будет возвращена столько раз, сколько соответствующих записей в правой таблице - по крайней мере 1, но может легко быть больше 1.
источник
LEFT OUTER JOIN, как и INNER JOIN (обычное соединение), вернет столько результатов для каждой строки в левой таблице, сколько совпадений найдет в правой таблице. Следовательно, вы можете получить много результатов - до N x M, где N - количество строк в левой таблице, а M - количество строк в правой таблице.
Минимальное количество результатов всегда гарантировано в LEFT OUTER JOIN и должно быть не менее N.
источник
Может ли быть отношение один ко многим между левой и правой таблицами?
источник
Обратите внимание, если у вас есть предложение where в таблице «right side» запроса, содержащего левое внешнее соединение ... Если у вас нет записи с правой стороны, удовлетворяющей предложению where, то соответствующая запись левой стороны таблица не появится в результате вашего запроса ....
источник
Если вам нужен только один ряд с правой стороны
или просто
источник
Кажется, что в таблице DATA.Dim_Member есть несколько строк на строку SUSP.Susp_Visits.
источник
если несколько (x) строк в Dim_Member связаны с одной строкой в Susp_Visits, в результирующем наборе будет x строк.
источник