복붙노트

[SQL] SQL 왼쪽 필터링 한 후 행을 잃고 가입

SQL

SQL 왼쪽 필터링 한 후 행을 잃고 가입

나는 다중 테이블 내가 기본 테이블에서 모든 행을 유지하기 위해 필요로하는 곳에 (두 예와 같이)에 가입해야합니다. 분명히 나는 ​​LEFT는 기본 테이블의 모든 행을 포함하는 조인을 사용. WHERE 절없이 잘 작동 - 행이 오른쪽 테이블의 컬럼에서 불과 0으로, 왼쪽의 여전히 테이블 쇼에서 오른쪽 테이블의 행이 존재하지 않는 경우. 데이터 세트의 처음 두 행은 왼쪽 테이블의 레이블이며, 레이블별로 그룹화 오른쪽 테이블에서 행으로 계산합니다. 레이블이 할당 된 표 2에서 값이없는 경우 모든 I의 희망은 0의 수입니다.

1 번 테이블

Label | FK
----------
Blue  | 1
Red   | 2
Green | 3

표 2

Values | Color | Date
---------------------------
Dog    | 1     | 02/02/2010
Cat    | 2     | 02/02/2010
Dog    | 1     | 02/02/2010
Cat    | 2     | 02/02/2010

질문:

SELECT 1.Label, COUNT(2.values)
FROM Table1 1
    LEFT JOIN Table2 2 ON 1.fk = 1.pk
GROUP BY 1.Label

좋은 결과 세트 - 아니 필터

Blue  | 2
Red   | 2
Green | 0

큰!

내 문제는 내가 행 내 왼쪽을 빼내 오른쪽 테이블에서 행을 제거하기 위해 행 조건을 조인 필터링을 추가 할 때 (그들을 밖으로 제로), 왼쪽 행이 삭제됩니다 것입니다. 나는 그들의 카운트 다운이 제로 여과 경우 왼쪽 행에도 유지해야합니다.

SELECT 1.Label, COUNT(2.values)
FROM Table1 1
    LEFT JOIN Table2 2 ON 1.fk = 1.pk
WHERE 2.Date BETWEEN '1/1/2010' AND '12/31/2010'    
GROUP BY 1.Label

저런 세트 결과 - 필터 후

Blue | 2
Red  | 2

공작!

그래서, 도대체 무슨 일? 나는 필터링 된 데이터 셋 다음은 왼쪽 테이블에 가입하여 임시 테이블을 얻을해야합니까? 나는 무엇을 놓치고? 감사!

A는 두 번째에 가입하거나 가입 재귀 마십시오. 테이블 조인 내 "좋은"GET "필터링"두 번째를 얻을 테이블, 다음 LEFT 그들을 가입

해결법

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

    1.당신은 어디에서 두 번째 테이블에 필터링된다. 값은 NULL이 될 수 및 NULL은 비교를 실패합니다.

    당신은 어디에서 두 번째 테이블에 필터링된다. 값은 NULL이 될 수 및 NULL은 비교를 실패합니다.

    절에에 어디 조건을 이동 :

    SELECT 1.Label, COUNT(2.values)
    FROM Table1 1
        LEFT JOIN Table2 2 ON 1.fk = 1.pk and
                  2.Date BETWEEN 1/1/2010 AND 12/31/2010    
    GROUP BY 1.Label
    
  2. ==============================

    2.단순히 ON 절에 WHERE 절에 조건을 이동합니다.

    단순히 ON 절에 WHERE 절에 조건을 이동합니다.

    LEFT JOIN Table2 2 ON 1.fk = 1.pk AND 2.Date BETWEEN '1/1/2010' AND '12/31/2010'
    
  3. ==============================

    3.우선 내가 그것을 별칭으로 번호가 좋은 아이디어라고 생각하지 않습니다. 문자 나 대신 단어를 사용합니다.

    우선 내가 그것을 별칭으로 번호가 좋은 아이디어라고 생각하지 않습니다. 문자 나 대신 단어를 사용합니다.

    조인에서 나는 기준을 둘 것입니다.

    SELECT T1.Label, COUNT(T2.values)
    FROM Table1 T1
        LEFT JOIN Table2 T2 ON T1.fk = T1.pk
        AND T2.Date BETWEEN '20100101' AND '20101231'    
    GROUP BY T1.Label
    

    기타 의견 :

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

    4.당신은 SQL 서버를 사용하는 경우, 날짜의 주위에 작은 따옴표를 넣어. 그렇지 않다면, 대신 날짜의 표현을 평가합니다.

    당신은 SQL 서버를 사용하는 경우, 날짜의 주위에 작은 따옴표를 넣어. 그렇지 않다면, 대신 날짜의 표현을 평가합니다.

    BETWEEN '1/1/2010' AND '12/31/2010'
    
  5. from https://stackoverflow.com/questions/18750464/sql-left-join-losing-rows-after-filtering by cc-by-sa and MIT license