복붙노트

[SQL] 왼쪽은 왼쪽 테이블에서 중복 행없이 가입

SQL

왼쪽은 왼쪽 테이블에서 중복 행없이 가입

다음 쿼리를보고하십시오 :

tbl_Contents

Content_Id  Content_Title    Content_Text
10002   New case Study   New case Study
10003   New case Study   New case Study
10004   New case Study   New case Study
10005   New case Study   New case Study
10006   New case Study   New case Study
10007   New case Study   New case Study
10008   New case Study   New case Study
10009   New case Study   New case Study
10010   SEO News Title   SEO News Text
10011   SEO News Title   SEO News Text
10012   Publish Contents SEO News Text

tbl_Mediya

Media_Id    Media_Title  Content_Id
1000    New case Study   10012
1001    SEO News Title   10010
1002    SEO News Title   10011
1003    Publish Contents 10012

질문

SELECT 
C.Content_ID,
C.Content_Title,
M.Media_Id

FROM tbl_Contents C
LEFT JOIN tbl_Media M ON M.Content_Id = C.Content_Id 
ORDER BY C.Content_DatePublished ASC

결과

10002   New case Study  2014-03-31 13:39:29.280 NULL
10003   New case Study  2014-03-31 14:23:06.727 NULL
10004   New case Study  2014-03-31 14:25:53.143 NULL
10005   New case Study  2014-03-31 14:26:06.993 NULL
10006   New case Study  2014-03-31 14:30:18.153 NULL
10007   New case Study  2014-03-31 14:30:42.513 NULL
10008   New case Study  2014-03-31 14:31:56.830 NULL
10009   New case Study  2014-03-31 14:35:18.040 NULL
10010   SEO News Title  2014-03-31 15:22:15.983 1001
10011   SEO News Title  2014-03-31 15:22:30.333 1002
10012   Publish         2014-03-31 15:25:11.753 1000
10012   Publish         2014-03-31 15:25:11.753 1003

10012 두 번오고있다 ...!

(조인에 왼쪽 테이블) 내 쿼리는 tbl_Contents에서 중복 행을 반환

tbl_Contents 일부 행 tbl_Media에서 1 개 이상의 관련 행이 있습니다. 나는이 널 값있는 tbl_Media하지만 중복 레코드에있는 경우에도 tbl_Contents의 모든 행이 필요합니다.

해결법

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

    1.OUTER가 적용 시도

    OUTER가 적용 시도

    SELECT 
        C.Content_ID,
        C.Content_Title,
        C.Content_DatePublished,
        M.Media_Id
    FROM 
        tbl_Contents C
        OUTER APPLY
        (
            SELECT TOP 1 *
            FROM tbl_Media M 
            WHERE M.Content_Id = C.Content_Id 
        ) m
    ORDER BY 
        C.Content_DatePublished ASC
    

    양자 택일로, 당신은 결과에 GROUP을 할 수

    SELECT 
        C.Content_ID,
        C.Content_Title,
        C.Content_DatePublished,
        M.Media_Id
    FROM 
        tbl_Contents C
        LEFT OUTER JOIN tbl_Media M ON M.Content_Id = C.Content_Id 
    GROUP BY
        C.Content_ID,
        C.Content_Title,
        C.Content_DatePublished,
        M.Media_Id
    ORDER BY
        C.Content_DatePublished ASC
    

    외측은 선택을 왼쪽 테이블의 각 행에 일치하는 하나의 행 (또는 없음)을 적용한다.

    그룹이 전체 가입 수행하지만 다음 제공된 컬럼에 대한 최종 결과 행을 축소합니다.

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

    2.당신은 GROUP BY와 함께이 사용하는 일반적인 SQL을 수행 할 수 있습니다 :

    당신은 GROUP BY와 함께이 사용하는 일반적인 SQL을 수행 할 수 있습니다 :

    SELECT C.Content_ID, C.Content_Title, MAX(M.Media_Id)
    FROM tbl_Contents C LEFT JOIN
         tbl_Media M
         ON M.Content_Id = C.Content_Id 
    GROUP BY C.Content_ID, C.Content_Title
    ORDER BY MAX(C.Content_DatePublished) ASC;
    

    또는 상관 하위 쿼리와 함께 :

    SELECT C.Content_ID, C.Contt_Title,
           (SELECT M.Media_Id
            FROM tbl_Media M
            WHERE M.Content_Id = C.Content_Id
            ORDER BY M.MEDIA_ID DESC
            LIMIT 1
           ) as Media_Id
    FROM tbl_Contents C 
    ORDER BY C.Content_DatePublished ASC;
    

    물론, 한계 1의 구문은 데이터베이스간에 다릅니다. 상단 될 수 있습니다. 또는 ROWNUM = 1 또는 처음 1 행을 가져옵니다. 또는 그런 일.

  3. ==============================

    3.DISTINCT 플래그를 사용하면 중복 행을 제거합니다.

    DISTINCT 플래그를 사용하면 중복 행을 제거합니다.

    SELECT DISTINCT
    C.Content_ID,
    C.Content_Title,
    M.Media_Id
    
    FROM tbl_Contents C
    LEFT JOIN tbl_Media M ON M.Content_Id = C.Content_Id 
    ORDER BY C.Content_DatePublished ASC
    
  4. from https://stackoverflow.com/questions/22769641/left-join-without-duplicate-rows-from-left-table by cc-by-sa and MIT license