복붙노트

[SQL] 어떻게 LEFT OUTER 왼쪽 테이블에 존재보다 더 많은 레코드를 반환 가입 할 수 있습니까?

SQL

어떻게 LEFT OUTER 왼쪽 테이블에 존재보다 더 많은 레코드를 반환 가입 할 수 있습니까?

나는 아주 기본적인 LEFT OUTER 왼쪽 테이블과 훨씬 더 큰 테이블에서 몇 가지 추가 정보에서 모든 결과를 반환하기 위해 가입해야합니다. 왼쪽 표는 4935 개 레코드가 아직 I LEFT OUTER가 추가로 테이블에 가입 할 때 레코드 개수는 상당히 크다.

지금까지 내가 알고 있어요로는 절대 복음은해야 내 이해의 같은 LEFT OUTER가 일치 할 수없는 행에 대한 올바른 테이블 널 (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에 대한 이해를 만들었 가입이 발생 할 수있는 방법을 잘하면 사람이 설명 할 수 불완전?

추신

, LEFT OUTER에 대한 이해 조인 위대한 답변 덕분에 누구나 그러나이 쿼리가 많은 레코드가 왼쪽 테이블에 존재로 반환 난 단지 얻을 수 있도록 수정할 수있는 방법을 제안 할 수있는, 훨씬 더 지금?

이 쿼리는 보고서 단순히 중복 일치 혼동 문제를 생성하기 위해 순전히이다.

/추신

해결법

  1. ==============================

    1.왼쪽 OUTER 가능한 곳 오른쪽 테이블과 조인 왼쪽 테이블에서 모든 레코드를 반환합니다 가입하세요.

    왼쪽 OUTER 가능한 곳 오른쪽 테이블과 조인 왼쪽 테이블에서 모든 레코드를 반환합니다 가입하세요.

    하지만 경기가있는 경우, 여전히 내부 조인처럼, 일치, 따라서 오른쪽에 두 개의 행과 일치하는 왼쪽에 하나 개의 행이 두 행으로 반환하는 모든 행을 반환합니다.

    편집하다: 귀하의 편집에 대응하여, 난 그냥 쿼리에서 더 살펴 했어 당신은 단지 왼쪽 테이블에서 데이터를 반환하는 것 같습니다. 당신은 왼쪽 테이블에서 데이터를 원하는 경우에만 왼쪽 테이블의 각 행에 대해 반환 한 행을하려는 경우 따라서, 당신은 전혀 가입하고 바로 왼쪽 테이블에서 직접 선택을 할 수있는 수행 할 필요가 없습니다.

  2. ==============================

    2.

    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
    
  3. ==============================

    3.그것은 불가능하지 않습니다. 왼쪽 테이블의 레코드 수는 반환 레코드의 최소 수입니다. 오른쪽 표는 두 개의 레코드가있는 경우 왼쪽 테이블에 일치하는 하나 개의 기록은 두 개의 레코드를 반환 것입니다.

    그것은 불가능하지 않습니다. 왼쪽 테이블의 레코드 수는 반환 레코드의 최소 수입니다. 오른쪽 표는 두 개의 레코드가있는 경우 왼쪽 테이블에 일치하는 하나 개의 기록은 두 개의 레코드를 반환 것입니다.

  4. ==============================

    4.포스트 스크립트에 대한 응답으로, 그것은 당신이 좋아하는 것이 무엇인지에 따라 달라집니다.

    포스트 스크립트에 대한 응답으로, 그것은 당신이 좋아하는 것이 무엇인지에 따라 달라집니다.

    조인 조건에 일치하는 항목이 여러 있기 때문에 당신은 당신의 왼쪽 테이블의 각 행에 대해 (수) 여러 행을 얻고있다. 쿼리의 왼쪽 부분에있는 한 총 결과는 당신이 있는지 확인해야 같은 수의 행을 원한다면 당신의 가입 조건은 1 대 1 경기를 일으킬.

    또한, 당신이 실제로 예를 들어, 당신은 단지 당신이 왼쪽 행의 오른쪽 결과의 쉼표로 구분 된 문자열 열을 생성 할 수있는 오른쪽 부분에서 문자열을하려는 경우 (집계 기능을 사용할 수 있습니다하려는 작업에 따라 달라집니다.

    당신은 단지 외부에서 1 또는 2 열에서 찾고 있다면 당신은 당신이 한 결과를 보장되기 때문에 스칼라 하위 쿼리를 사용하는 것이 좋습니다 가입 할 수 있습니다.

  5. ==============================

    5.왼쪽 테이블에서 각 레코드는 일치하는 올바른 테이블에 레코드가 수만큼 반환됩니다 - 적어도 1,하지만 쉽게 더 1보다 수 있습니다.

    왼쪽 테이블에서 각 레코드는 일치하는 올바른 테이블에 레코드가 수만큼 반환됩니다 - 적어도 1,하지만 쉽게 더 1보다 수 있습니다.

  6. ==============================

    6.LEFT OUTER은 오른쪽 테이블에서 찾은 많은 경기로 왼쪽 테이블의 각 행에 대해 많은 결과로 반환됩니다 (일반 가입) 가입 만 INNER처럼 가입. 최대 N은 왼쪽 테이블의 행 수이고 M은 바로 테이블에있는 행의 수를 N X M에 - 따라서 당신은 결과를 많이 가질 수 있습니다.

    LEFT OUTER은 오른쪽 테이블에서 찾은 많은 경기로 왼쪽 테이블의 각 행에 대해 많은 결과로 반환됩니다 (일반 가입) 가입 만 INNER처럼 가입. 최대 N은 왼쪽 테이블의 행 수이고 M은 바로 테이블에있는 행의 수를 N X M에 - 따라서 당신은 결과를 많이 가질 수 있습니다.

    항상 LEFT OUTER에 보장 결과의 최소 번호가 적어도 N.에있을 가입의

  7. ==============================

    7.그것은 왼쪽과 오른쪽 테이블 사이에 많은 관계로 하나가 될 수 있을까?

    그것은 왼쪽과 오른쪽 테이블 사이에 많은 관계로 하나가 될 수 있을까?

  8. ==============================

    8.주의하십시오 당신은 왼쪽 외부 조인이 포함 된 쿼리의 '오른쪽'테이블에 where 절이있는 경우 ... 경우 당신이 만족 오른쪽에 대한 기록이없는 절은 다음, '왼쪽'테이블의 해당 레코드가 쿼리의 결과에 나타나지 않습니다 어디에 ....

    주의하십시오 당신은 왼쪽 외부 조인이 포함 된 쿼리의 '오른쪽'테이블에 where 절이있는 경우 ... 경우 당신이 만족 오른쪽에 대한 기록이없는 절은 다음, '왼쪽'테이블의 해당 레코드가 쿼리의 결과에 나타나지 않습니다 어디에 ....

  9. ==============================

    9.당신은 오른쪽에서 단 하나 개의 행을해야하는 경우

    당신은 오른쪽에서 단 하나 개의 행을해야하는 경우

    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
    )
    
  10. ==============================

    10.SUSP.Susp_Visits 행 당 DATA.Dim_Member 테이블의 여러 행이있는 것처럼 보인다.

    SUSP.Susp_Visits 행 당 DATA.Dim_Member 테이블의 여러 행이있는 것처럼 보인다.

  11. ==============================

    11.Dim_Member에 복수 (X) Susp_Visits 행에 하나의 행과 연관되는 경우 있습니다 END_STRONG_1 세트 X 행이있을 것이다.

    Dim_Member에 복수 (X) Susp_Visits 행에 하나의 행과 연관되는 경우 있습니다 END_STRONG_1 세트 X 행이있을 것이다.

  12. from https://stackoverflow.com/questions/916414/how-can-a-left-outer-join-return-more-records-than-exist-in-the-left-table by cc-by-sa and MIT license