복붙노트

[SQL] SQL Server는 누락 된 NULL 값 가입

SQL

SQL Server는 누락 된 NULL 값 가입

나는 다음과 같은 두 테이블이 있다고 가정 :

      Table1:                                Table2:
Col1:      Col2:     Col3:             Col1:       Col2:       Col4:
a          b         c                 a           b           d
e          <null>    f                 e           <null>      g
h          i         j                 h           i           k
l          <null>    m                 l           <null>      n
o          <null>    p                 o           <null>      q

지금, 나는 COL1과 Col2의와 같은 모양에 전체 세트를 다시 가져 이러한 테이블을 조인 할 :

     Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
e          <null>    f         g
h          i         j         k
l          <null>    m         n
o          <null>    p         q

그래서, 나는 SQL을 같은 시도 :

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col1 
AND Table1.Col2 = Table2.Col2

내가 끝낼 수 있도록하지만, Col2의에서 NULL 값을 일치하지 않습니다 :

     Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
h          i         j         k

어떻게 내가 찾고 있어요 결과를 얻을 수 있습니다?

감사!

해결법

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

    1.조인에 대해 당신은 명시 적으로 할 수 있습니다 :

    조인에 대해 당신은 명시 적으로 할 수 있습니다 :

    SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
    FROM Table1 INNER JOIN
         Table2
          ON (Table1.Col1 = Table2.Col1 or Table1.Col1 is NULL and Table2.Col1 is NULL) AND
             (Table1.Col2 = Table2.Col2 or Table1.Col2 is NULL and Table2.Col2 is NULL)
    

    실제로, 나는 가능성 상태 조인 COALESCE ()를 사용하는 것입니다 :

    SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
    FROM Table1 INNER JOIN
         Table2
         ON (coalesce(Table1.Col1, '') = coalesce(Table2.Col1, '')) AND
            (coalesce(Table1.Col2, '') = coalesce(Table2.Col2, ''))
    

    어디 '가 아닌 테이블 중 하나의 값이 될 것입니다.

    주의 그냥 단어. 대부분의 데이터베이스에서 사용하여 이러한 구조의 인덱스의 사용을 방지 할 수 있습니다.

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

    2.(왼쪽) 외부 대신 null로 행을 포함하는 가입 내부의 가입.

    (왼쪽) 외부 대신 null로 행을 포함하는 가입 내부의 가입.

    SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
    FROM Table1 LEFT OUTER JOIN 
        Table2 ON Table1.Col1 = Table2.Col1 
        AND Table1.Col2 = Table2.Col2
    

    자세한 내용은 여기를 참조 : http://technet.microsoft.com/en-us/library/ms190409(v=sql.105).aspx

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

    3.ISNULL 함수를 사용하여보십시오 :

    ISNULL 함수를 사용하여보십시오 :

    SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
    FROM Table1 
    INNER JOIN Table2
       ON Table1.Col1 = Table2.Col1 
       AND ISNULL(Table1.Col2, 'ZZZZ') = ISNULL(Table2.Col2,'ZZZZ')
    

    어디 ZZZZ '은 결코 테이블에 어떤 임의의 값입니다.

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

    4.더러운 빠른 해킹 :

    더러운 빠른 해킹 :

    SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
    FROM Table1 INNER JOIN Table2 ON Table1.Col1 = Table2.Col1
     AND ((Table1.Col2 = Table2.Col2) OR (Table1.Col2 IS NULL AND Table2.Col2 IS NULL))
    
  5. ==============================

    5.당신은 그런 식으로 매핑 할 수 있습니다

    당신은 그런 식으로 매핑 할 수 있습니다

    select * from tableA a
    join tableB b on isnull(a.colID,'') = isnull(b.colId,'')
    
  6. ==============================

    6.어떤 이유로 나는 가입을 외부로 작업에 가져올 수 없습니다.

    어떤 이유로 나는 가입을 외부로 작업에 가져올 수 없습니다.

    그래서 사용 :

    SELECT * from t1 where not Id in (SELECT DISTINCT t2.id from t2)
    
  7. ==============================

    7.조인 추가 조건을 사용해보십시오 :

    조인 추가 조건을 사용해보십시오 :

    SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
    FROM Table1 
    INNER JOIN Table2
    ON (Table1.Col1 = Table2.Col1 
        OR (Table1.Col1 IS NULL AND Table2.Col1 IS NULL)
       )
    
  8. from https://stackoverflow.com/questions/14366004/sql-server-join-missing-null-values by cc-by-sa and MIT license