Как ЛЕВОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ может возвратить больше записей, чем существуют в столе, из-за которого встают?

Чтобы решить эту проблему, я открыл httpd.conf и изменил следующую строку:

Allow from 127.0.0.1

на:

Allow from 127.0.0.1 ::1
144
задан Jay Wilde 6 September 2018 в 17:42
поделиться

10 ответов

LEFT OUTER JOIN вернет все записи из LEFT таблицы, соединенной с RIGHT таблица, где это возможно.

Если есть совпадения, он все равно будет возвращать все совпадающие строки, поэтому одна строка в LEFT, которая соответствует двум строкам в RIGHT, будет возвращена как две ROWS, как и INNER JOIN.

EDIT : В ответ на ваше изменение я только что изучил ваш запрос и, похоже, вы возвращаете данные только из ЛЕВОЙ таблицы. Следовательно, если вам нужны только данные из таблицы LEFT, и вы хотите, чтобы для каждой строки в таблице LEFT возвращалась только одна строка, тогда вам вообще не нужно выполнять JOIN, и вы можете просто выполнить SELECT непосредственно из таблицы LEFT.

165
ответ дан 23 November 2019 в 22:53
поделиться
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
104
ответ дан 23 November 2019 в 22:53
поделиться

Это не невозможно. Количество записей в левой таблице - это минимальное количество возвращаемых записей. Если в правой таблице есть две записи, соответствующие одной записи в левой таблице, она вернет две записи.

31
ответ дан 23 November 2019 в 22:53
поделиться

В ответ на ваш постскриптум, это зависит от того, что вы хотел бы.

Вы получаете (возможно) несколько строк для каждой строки в левой таблице, потому что существует несколько совпадений для условия соединения. Если вы хотите, чтобы в ваших общих результатах было то же количество строк, что и в левой части запроса, вам необходимо убедиться, что ваши условия соединения приводят к совпадению 1: 1.

В качестве альтернативы, в зависимости от того, что вы на самом деле хотите, чтобы вы могли использовать агрегатные функции (если, например, вам просто нужна строка из правой части, вы можете создать столбец, который представляет собой строку с разделителями-запятыми, содержащую результаты правой стороны для этой левой строки.

11
ответ дан 23 November 2019 в 22:53
поделиться

Каждая запись из левой таблицы будет возвращена столько раз, сколько совпадают записи в правой таблице - минимум 1, но может быть больше 1.

8
ответ дан 23 November 2019 в 22:53
поделиться

Если вам нужна только одна строка с правой стороны

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
)
4
ответ дан 23 November 2019 в 22:53
поделиться

LEFT OUTER JOIN, как и INNER JOIN (обычное соединение), вернет столько результатов для каждой строки в левой таблице, сколько совпадений она найдет в правой таблице. Следовательно, у вас может быть много результатов - до N x M, где N - количество строк в левой таблице, а M - количество строк в правой таблице.

В LEFT OUTER JOIN всегда гарантировано минимальное количество результатов, равное N.

8
ответ дан 23 November 2019 в 22:53
поделиться

Может ли быть связь "один ко многим" между левой и правой таблицами?

7
ответ дан 23 November 2019 в 22:53
поделиться

Кажется, что в таблице DATA.Dim_Member есть несколько строк для каждой строки SUSP.Susp_Visits.

2
ответ дан 23 November 2019 в 22:53
поделиться

если несколько (x) строк в Dim_Member связаны с одной строкой в ​​Susp_Visits, в результирующем наборе будет x строк.

2
ответ дан 23 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: