programing

LEFT OUTER JOIN이 왼쪽 테이블에 있는 것보다 더 많은 레코드를 반환하려면 어떻게 해야 합니까?

itsource 2023. 4. 7. 23:29
반응형

LEFT OUTER JOIN이 왼쪽 테이블에 있는 것보다 더 많은 레코드를 반환하려면 어떻게 해야 합니까?

왼쪽 테이블의 모든 결과와 훨씬 더 큰 테이블의 추가 정보를 반환하기 위한 매우 기본적인 왼쪽 외부 조인(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 JOIN은 가능한 경우 RIGHT 테이블과 결합된 LEFT 테이블의 모든 레코드를 반환합니다.

일치하는 행이 있으면 일치하는 행이 모두 반환되므로 REFT의 2행과 일치하는1행은 INSER JOIN과 마찬가지로2개의 ROWS로 반환됩니다.

편집: 편집에 대한 응답으로 방금 문의 내용을 확인했는데 왼쪽 테이블에서 데이터만 반환하는 것 같습니다.따라서 왼쪽 테이블의 데이터만 반환하고 왼쪽 테이블의 각 행에 대해 1개의 행만 반환하는 경우 JOIN을 수행할 필요가 없으며 왼쪽 테이블에서 직접 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개의 레코드가 있는 경우 2개의 레코드가 반환됩니다.

당신의 후기에 대한 답변은 당신이 무엇을 좋아하느냐에 달려 있습니다.

조인 조건에 일치하는 항목이 여러 개 있기 때문에 왼쪽 테이블의 각 행에 여러 개의 행이 있을 수 있습니다.쿼리의 왼쪽 부분과 같은 행 수를 합계 결과에 포함시키려면 가입 조건에 따라 1:1이 일치하는지 확인해야 합니다.

또는 실제로 원하는 항목에 따라 집약 함수를 사용할 수 있습니다(예를 들어 오른쪽 부분 문자열만 원하는 경우 왼쪽 행에 대해 오른쪽 결과의 쉼표로 구분된 문자열인 열을 생성할 수 있습니다).

외부 결합에서 1개 또는 2개의 열만 보고 있는 경우 1개의 결과가 보장되므로 스칼라 서브쿼리의 사용을 고려할 수 있습니다.

왼쪽 테이블의 각 레코드는 오른쪽 테이블에 일치하는 레코드가 있는 횟수만큼 반환됩니다(적어도 1개 이상이지만 쉽게 1개 이상일 수 있습니다).

좌우 테이블이 1대 다의 관계일까요?

LEFT OUTER JOIN은 INSER JOIN(일반 조인)과 마찬가지로 왼쪽 테이블의 각 행에 대해 오른쪽 테이블의 일치 항목 수만큼 결과가 반환됩니다.따라서 최대 N x M의 결과를 얻을 수 있습니다. 여기서 N은 왼쪽 표의 행 수이고 M은 오른쪽 표의 행 수입니다.

LEFT OUTER JOIN에서 항상 보장되는 최소 결과 수는 N개입니다.

오른쪽에서 한 줄만 필요하시면

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
)

왼쪽 외부 조인을 포함하는 쿼리의 "오른쪽" 테이블에 where 절이 있는 경우 주의하십시오.오른쪽에 where 절을 충족하는 레코드가 없는 경우 쿼리 결과에 '왼쪽' 테이블의 해당 레코드는 표시되지 않습니다.

DATA에는 여러 행이 있는 것 같습니다.SUSP당 Dim_Member 테이블입니다.Suspend_Visits 행.

Dim_Member의 여러 행이 Suspend_Visits의 한 행과 관련되어 있는 경우 Resul 세트에 x 행이 있습니다.

다 더 많은 즉, " " " " " " " " " " " " " " " " 。SUSP.Susp_Visits입니까?SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum는 오른쪽행( )과하고 있습니다.DATA.Dim_Member 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 하다.DATA.Dim_Member서, 「」에는 합니다.DATA.Dim_Member.MembershipNum다음 쿼리를 실행하여 이를 확인할 수 있습니다.

select DATA.Dim_Member.MembershipNum, count(DATA.Dim_Member.MembershipNum) from DATA.Dim_Member group by DATA.Dim_Member.MembershipNum

왼쪽 테이블에는 4935개의 레코드가 있기 때문에 4935개의 레코드가 반환되기를 바라는 것 같습니다.이것을 시험해 보세요.

create table table1
(siteID int, 
SuspReason int)

create table table2
(siteID int, 
SuspReason int)

insert into table1(siteID, SuspReason) values 
(1, 678), 
(1, 186), 
(1, 723)
    
insert into table2(siteID, SuspReason) values 
(1, 678),
(1, 965)
   
select distinct t1.siteID, t1.SuspReason
from table1 t1 left join table2 t2 on t1.siteID = t2.siteID and t1.SuspReason = t2.SuspReason

union 

select distinct t2.siteID, t2.SuspReason 
from table1 t1 right join table2 t2 on t1.siteID = t2.siteID and t1.SuspReason = t2.SuspReason

간단히 말해, 왼쪽 외부 결합은 왼쪽 테이블의 일치하지 않는 행과 함께 각 조인 키 내의 데카르트 곱입니다(즉, table_L에 N개의 레코드가 있고 table_R에 M>0이면 N개의 레코드가 결과에 포함됩니다).

언급URL : https://stackoverflow.com/questions/916414/how-can-a-left-outer-join-return-more-records-than-exist-in-the-left-table

반응형