Program Tip

SQL Server JOIN에 NULL 값이 없습니다.

programtip 2021. 1. 10. 19:30
반응형

SQL Server JOIN에 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

지금, 나는에서 이러한 테이블을 조인 할 Col1Col2와 같은 모습으로 다시 전체 세트를 가지고 :

     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

하지만의 NULL값과 일치하지 않으므로 Col2다음과 같이 끝납니다.

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

원하는 결과를 어떻게 얻을 수 있습니까 ??

감사!


조인에 대해 명시 할 수 있습니다.

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, ''))

''어느 테이블에도없는 값은 어디에 있습니까 ?

주의의 한마디. 대부분의 데이터베이스에서 이러한 구성을 사용하면 인덱스 사용이 방지됩니다.


NULLS가있는 행을 포함하려면 Inner Join 대신 Left Outer Join을 사용하십시오.

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


Try using ISNULL function:

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')

Where 'ZZZZ' is some arbitrary value never in the table.


Dirty and quick hack:

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))

you can just map like that

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

for some reason I couldn't get it to work with the outer join.

So I used:

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

ReferenceURL : https://stackoverflow.com/questions/14366004/sql-server-join-missing-null-values

반응형