LEFT OUTER JOIN은 왼쪽 테이블에있는 것보다 더 많은 레코드를 어떻게 반환 할 수 있습니까?
왼쪽 테이블의 모든 결과와 훨씬 큰 테이블의 추가 정보를 반환하는 매우 기본적인 LEFT OUTER JOIN이 있습니다. 왼쪽 테이블에는 4935 개의 레코드가 포함되어 있지만 외부 테이블에 추가하면 레코드 수가 훨씬 큽니다.
내가 아는 한 LEFT OUTER JOIN은 왼쪽 테이블의 모든 레코드를 오른쪽 테이블의 일치하는 레코드와 일치시킬 수없는 행에 대해 null 값을 반환한다는 것은 절대적인 복음입니다. 왼쪽 테이블에있는 것보다 많은 행을 반환하는 것은 불가능하지만 모두 동일하게 발생합니다!
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에 대한 이해가 훨씬 좋아졌습니다.하지만 왼쪽 테이블에 존재하는만큼의 레코드 만 반환하도록이 쿼리를 수정할 수있는 방법을 제안 할 수 있습니까?
이 쿼리는 순전히 보고서를 생성하기위한 것이며 중복 된 일치 항목은 문제를 혼동하기 만합니다.
/추신
LEFT OUTER JOIN은 가능한 경우 RIGHT 테이블과 조인 된 LEFT 테이블의 모든 레코드를 반환합니다.
일치하는 항목이 있으면 일치하는 모든 행을 계속 반환하므로 RIGHT의 두 행과 일치하는 LEFT의 한 행은 INNER JOIN과 같이 두 개의 ROWS로 반환됩니다.
편집 : 편집에 대한 응답으로 쿼리를 자세히 살펴 보았으므로 LEFT 테이블에서만 데이터를 반환하는 것처럼 보입니다. 따라서 LEFT 테이블의 데이터 만 원하고 LEFT 테이블의 각 행에 대해 하나의 행만 리턴하려는 경우 JOIN을 전혀 수행 할 필요가 없으며 LEFT 테이블에서 직접 SELECT를 수행 할 수 있습니다.
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 개 또는 2 개의 열만보고있는 경우 1 개의 결과가 보장되므로 스칼라 하위 쿼리 사용을 고려할 수 있습니다.
왼쪽 테이블의 각 레코드는 오른쪽 테이블에 일치하는 레코드가있는 횟수 (적어도 1이지만 1보다 클 수 있음)만큼 여러 번 반환됩니다.
INNER JOIN (정상 조인)과 마찬가지로 LEFT OUTER JOIN은 왼쪽 테이블의 각 행에 대해 오른쪽 테이블에서 찾은 수만큼 많은 결과를 반환합니다. 따라서 N x M까지 많은 결과를 얻을 수 있습니다. 여기서 N은 왼쪽 테이블의 행 수이고 M은 오른쪽 테이블의 행 수입니다.
LEFT OUTER JOIN에서 항상 N 이상의 최소 결과 수를 보장합니다.
왼쪽 테이블과 오른쪽 테이블 사이의 일대 다 관계 일 수 있습니까?
왼쪽 외부 조인을 포함하는 쿼리의 "오른쪽"테이블에 where 절이있는 경우주의하십시오. 오른쪽에 where 절을 만족시키는 레코드가없는 경우 '왼쪽의 해당 레코드 '테이블이 쿼리 결과에 나타나지 않습니다 ....
오른쪽에서 하나의 행만 필요한 경우
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
)
It seems as though there are multiple rows in the DATA.Dim_Member table per SUSP.Susp_Visits row.
if multiple (x) rows in Dim_Member are associated with a single row in Susp_Visits, there will be x rows in the resul set.
'Programing' 카테고리의 다른 글
PHP에서 세션 시간 초과를 변경하는 방법은 무엇입니까? (0) | 2020.06.19 |
---|---|
텍스트 OpenCV 추출 (0) | 2020.06.19 |
Eclipse, Android에서 가상 장치를 삭제할 수 없습니다 (0) | 2020.06.19 |
Node.js 및 Express를 사용하여 POST 할 때 요청 본문에 액세스하는 방법은 무엇입니까? (0) | 2020.06.18 |
Git 원격 URL 변경 후 원격 거부 (얕은 업데이트는 허용되지 않음) (0) | 2020.06.18 |