programing

SQL Server JOIN에 NULL 값이 누락되었습니다.

powerit 2023. 5. 18. 21:29
반응형

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

이제, 이 표들에 참여하고 싶습니다.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

하지만 그것은 일치하지 않습니다.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

사용해 보십시오.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'테이블에 없는 임의의 값입니다.

더티하고 빠른 해킹:

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

당신은 그냥 그렇게 지도를 만들 수 있습니다.

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

어떤 이유로 외부 결합과 함께 작동할 수 없었습니다.

그래서 저는 다음을 사용했습니다.

SELECT * from t1 where not Id in (SELECT DISTINCT t2.id from t2)
declare @Table1 as Table(Col1 varchar(1),Col2 varchar(1), Col3 varchar(1))
declare @Table2 as Table(Col1 varchar(1),Col2 varchar(1), Col4 varchar(1))
insert into @Table1
values('a',          'b',     'c'),
('e',          null,    'f'), 
('h',          'i'  ,   'j'), 
('l',          null  ,  'm'), 
('o',          null  ,  'p') 
insert into @Table2
values('a',          'b',     'd'),
('e',          null,    'g'), 
('h',          'i'  ,   'k'), 
('l',          null  ,  'n'), 
('o',          null  ,  'q') 


select * from @Table1 tbl1
join @Table2 tbl2
on tbl1.Col1 =tbl2.Col1
and isnull(tbl1.Col2,0) =isnull(tbl2.Col2,0)

출력:

 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

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

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

유일한 정답은 null 값을 가진 열을 조인하지 않는 것입니다.이로 인해 원치 않는 행동이 매우 빠르게 발생할 수 있습니다.

예: null(b.colId,'):데이터에 빈 문자열이 있으면 어떻게 됩니까?조인은 중복 행일 수 있지만 이 경우에는 의도하지 않은 것 같습니다.

일부 SQL 구현에는 특수 Null-safe equal 연산자가 있습니다.

예를 들어 Snowflake의 Equal_NULL은 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/14366004/sql-server-join-missing-null-values

반응형