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
'programing' 카테고리의 다른 글
NPM 패키지의 종속성, devDependencies 및 peerDependencies의 차이점은 무엇입니까?json 파일? (0) | 2023.05.18 |
---|---|
UI 이미지 자르기 (0) | 2023.05.18 |
Mac OS X 10.8 / Xcode 4.4에서 gcc를 사용/설치하는 방법 (0) | 2023.05.18 |
Git: '헤드 분리' 상태에서 복귀하는 방법 (0) | 2023.05.18 |
Git Bash에 복사하여 붙여넣는 방법 (0) | 2023.05.18 |