Чтобы решить эту проблему, я открыл httpd.conf
и изменил следующую строку:
Allow from 127.0.0.1
на:
Allow from 127.0.0.1 ::1
LEFT OUTER JOIN вернет все записи из LEFT таблицы, соединенной с RIGHT таблица, где это возможно.
Если есть совпадения, он все равно будет возвращать все совпадающие строки, поэтому одна строка в LEFT, которая соответствует двум строкам в RIGHT, будет возвращена как две ROWS, как и INNER JOIN.
EDIT : В ответ на ваше изменение я только что изучил ваш запрос и, похоже, вы возвращаете данные только из ЛЕВОЙ таблицы. Следовательно, если вам нужны только данные из таблицы LEFT, и вы хотите, чтобы для каждой строки в таблице LEFT возвращалась только одна строка, тогда вам вообще не нужно выполнять JOIN, и вы можете просто выполнить SELECT непосредственно из таблицы LEFT.
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
Это не невозможно. Количество записей в левой таблице - это минимальное количество возвращаемых записей. Если в правой таблице есть две записи, соответствующие одной записи в левой таблице, она вернет две записи.
В ответ на ваш постскриптум, это зависит от того, что вы хотел бы.
Вы получаете (возможно) несколько строк для каждой строки в левой таблице, потому что существует несколько совпадений для условия соединения. Если вы хотите, чтобы в ваших общих результатах было то же количество строк, что и в левой части запроса, вам необходимо убедиться, что ваши условия соединения приводят к совпадению 1: 1.
В качестве альтернативы, в зависимости от того, что вы на самом деле хотите, чтобы вы могли использовать агрегатные функции (если, например, вам просто нужна строка из правой части, вы можете создать столбец, который представляет собой строку с разделителями-запятыми, содержащую результаты правой стороны для этой левой строки.
Каждая запись из левой таблицы будет возвращена столько раз, сколько совпадают записи в правой таблице - минимум 1, но может быть больше 1.
Если вам нужна только одна строка с правой стороны
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
)
LEFT OUTER JOIN, как и INNER JOIN (обычное соединение), вернет столько результатов для каждой строки в левой таблице, сколько совпадений она найдет в правой таблице. Следовательно, у вас может быть много результатов - до N x M, где N - количество строк в левой таблице, а M - количество строк в правой таблице.
В LEFT OUTER JOIN всегда гарантировано минимальное количество результатов, равное N.
Может ли быть связь "один ко многим" между левой и правой таблицами?
Кажется, что в таблице DATA.Dim_Member есть несколько строк для каждой строки SUSP.Susp_Visits.
если несколько (x) строк в Dim_Member связаны с одной строкой в Susp_Visits, в результирующем наборе будет x строк.