http://jajking-textcube.blogspot.kr/2009/08/oracle%EC%97%90%EC%84%9C%EC%9D%98-minus-mssql%EC%97%90%EC%84%9C-%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EC%97%86%EC%9D%84%EA%B9%8C.html#comment-form
MSSQL에서 Oracle에서의 Minus 구현하는 방법
select * from TBL1
EXCEPT
select * from TBL2
=====================================================
MSSQL에서 MINUS기능 구현하기
Oracle 에서 두 테이블의 차이를 알고 싶을때는 간단하게 minus 기능을 이용해서 값을 구할 수 있습니다.
예)
A테이블에서 B테이블을 빼기
SELECT * FROM TABLE_A
MINUS
SELECT * FROM TABLE_B
B테이블에서 A테이블을 빼기
SELECT * FROM TABLE_B
MINUS
SELECT * FROM TABLE_A
결과: A 테이블에는 존재하지만 B 테이블에는존재하지 않는 모든 레코드
(그러므로 양 테이블의 모든 차분레코드를 가지고 오려면 B 테이블에서도 A테이블을 MINUS 해줘야 합니다.)
그렇다면 MSSQL(SQL SERVER) 에서는 어떻게 MINUS 기능을 구현 할까요?
따로 명령어가 있는게 아니라 SQL쿼리로 구현해야 합니다.
A테이블에서 B테이블을 빼기
SELECT * FROM TABLE_A
WHERE NOT EXIST ( SELECT * FROM TABLE_B B
WHERE KEY1 = B.KEY1 AND KEY2 = B.KEY2 )
B테이블에서 A테이블을 빼기
SELECT * FROM TABLE_B
WHERE NOT EXIST ( SELECT * FROM TABLE_A B
WHERE KEY1 = B.KEY1 AND KEY2 = B.KEY2 )
이렇게 하면 ORACLE에서의 MINUS와 같은 검색결과가 나올까요??? 저도 그런듯 했으나..아니였습니다
뭐가 문제냐면 키값만 비교해서 다른걸 가져오니 당근 컬럼속 다른값이 틀리면 아무 소용이 없습니다.
(이 쿼리는 비교할 테이블의 키 값만을 서로 비교한다면 유효한 쿼리겠죠!!^^)
그럼 무식하게 전 컬럼을 다 비교 해야겠다고 생각해봤죠....
A테이블에서 B테이블을 빼기
SELECT * FROM TABLE_A
WHERE NOT EXIST ( SELECT * FROM TABLE_B B
WHERE KEY1 = B.KEY1 AND KEY2 = B.KEY2
And Column3 = B.Column3
And Column4 = B.Column4
And Column5 = B.Column5
...
And ColumnN = B.ColumnN)
B테이블에서 A테이블을 빼기
SELECT * FROM TABLE_B
WHERE NOT EXIST ( SELECT * FROM TABLE_A B
WHERE KEY1 = B.KEY1 AND KEY2 = B.KEY2
And Column3 = B.Column3
And Column4 = B.Column4
And Column5 = B.Column5
...
And ColumnN = B.ColumnN)
이렇게 하면 만족하는 결과를 얻을 수 있을까요? 언뜻 보면 완벽하게 두 테이블을 비교 가능 한것처럼 보입니다. 하지만 다양하게 테스트를 하다보면 역시 아니구나 하는 생각이 듭니다.
바로 NULL 값 비교가 문제가 되죵... MSSQL(SQL SERVER)에서나 ORACLE 에서 NULL 값은 어떤 값과도 비교가 되지 안는다는 특징을 가지고 있습니다. 어떻게 보면 NULL이란 값은 존재하지도 않는 값이라서 비교한다는 것 자체가 말이 안되는 것일 수 도 있습니다.
결과적으로 완성된 쿼리를 만들어 보면 아래와 같습니다.
A테이블에서 B테이블을 빼기
SELECT * FROM TABLE_A
WHERE NOT EXIST ( SELECT * FROM TABLE_B B
WHERE KEY1 = B.KEY1 AND KEY2 = B.KEY2
And ISNULL(Column3,'') = ISNULL(B.Column3,'')
And ISNULL(Column4,'') = ISNULL(B.Column4,'')
And ISNULL(Column5,'') = ISNULL(B.Column5,'')
...
And ISNULL(ColumnN,'') = ISNULL(B.ColumnN,''))
B테이블에서 A테이블을 빼기
SELECT * FROM TABLE_B
WHERE NOT EXIST ( SELECT * FROM TABLE_A B
WHERE KEY1 = B.KEY1 AND KEY2 = B.KEY2
And ISNULL(Column3,'') = ISNULL(B.Column3,'')
And ISNULL(Column4,'') = ISNULL(B.Column4,'')
And ISNULL(Column5,'') = ISNULL(B.Column5,'')
...
And ISNULL(ColumnN,'') = ISNULL(B.ColumnN,''))
ISNULL함수를 이용해서 NULL값을 공백 값으로 변경한다음 비교를 하면 끝 입니다..^^
ORACLE에서 MINUS 처럼 깔끔하게 결과를 도출하기에는 컬럼수가 많아지면 어렵지만 결과적으로
정확하게 비교하는게 중요한거겠죵.^^
우측상단에 첨부파일에 예제를 올려놨습니다 참고하세요
대한민국 개발자 여러분 홧팅하세요..
'Tech' 카테고리의 다른 글
row_number()over (0) | 2012.07.05 |
---|---|
ie7 css핵 url (0) | 2012.07.03 |
SQL Server Performance Tips and Guidelines (0) | 2012.06.29 |
Prezi::한글 (0) | 2012.06.18 |
NOTEPAD++ (0) | 2012.04.24 |
병합 풀고 값 채우기 (0) | 2012.03.29 |