두 테이블의 컬럼 3개 값들 비교 쿼리 0 8 3,795

by sm5 [SQL Query] [2013.05.10 22:55:31]



안녕하세요.

A , B  라는 두 테이블이 있습니다.
 
이 두테이블에는 1,2,3 이라는 컬럼이 있는데요..

이 컬럼값들을 비교해서 틀린 컬럼을 찾고 싶습니다.
즉,)  
   1,2 컬럼값이 서로 같고 3컬럼값만 다른경우
   1,3컬럼값은 같고  2컬럼값만 다른 경우
    2,3컬럼값은 같고  1컬럼값만 다른 경우
   1,2,3 컬럼이 전부 다른 경우

이렇게 4가지 경우만 딱 비교할려고 합니다.
그럼..아래 방법 밖에는 없나요? 한방쿼리로 좀 보기좋게 나오게 할수는 없는지요?^^ 부탁드립니다.

--  1,2 컬럼값이 서로 같고 3컬럼값만 다른경우
SELECT * FROM A, B
WHERE (A.1 = B.1 AND A.2 = B.2)
AND A.3 <> B.3;

--  1,3컬럼값은 같고  2컬럼값만 다른 경우
SELECT * FROM A, B
WHERE (A.1 = B.1 AND A.3 = B.3)
AND A.2 <> B.2;

--  2,3컬럼값은 같고  1컬럼값만 다른 경우
SELECT * FROM A, B
WHERE (A.2 = B.2 AND A.3 = B.3)
AND A.1 <> B.1;


--  1,2,3 컬럼이 전부 다른 경우
SELECT * FROM A, B
WHERE A.1 <> B.1 AND A.2 <> B.2
AND A.3 <> B.3;
by 아린 [2013.05.11 09:29:23]
WHERE 부분으로 나눈 것을 CASE 로 통합하시면 될것같네요.
단, 테이블끼리의 KEY 컬럼이 안보이네요..

WITH a(key, a1, a2, a3) AS(
SELECT '1', 1, 2, 3 FROM dual UNION ALL
SELECT '2', 1, 2, 3 FROM dual UNION ALL
SELECT '3', 1, 2, 3 FROM dual UNION ALL
SELECT '4', 1, 2, 3 FROM dual UNION ALL
SELECT '5', 1, 2, 3 FROM dual
), b(key, b1, b2, b3) AS(
SELECT '1', 1, 2, 4 FROM dual UNION ALL
SELECT '2', 1, 4, 3 FROM dual UNION ALL
SELECT '3', 6, 2, 3 FROM dual UNION ALL
SELECT '4', 9, 9, 9 FROM dual UNION ALL
SELECT '5', 1, 2, 3 FROM dual
)
SELECT CASE WHEN a1  = b1 AND a2  = b2 AND a3 != b3 THEN 'case1'
            WHEN a1  = b1 AND a3  = b3 AND a2 != b2 THEN 'case2'
            WHEN a2  = b2 AND a3  = b3 AND a1 != b1 THEN 'case3'
            WHEN a2 != b2 AND a3 != b3 AND a1 != b1 THEN 'case4'
            ELSE 'else'
       END type
     , a1, a2, a3, b1, b2, b3              
  FROM a, b
 WHERE a.key = b.key 

by 아린 [2013.05.11 13:55:27]
그럼 데이터 건수는 A * B 테이블 건수 만큼 나오겠네요.
아래 join 부분 빼고 하시면 될 것 같구요. 
원하시는 데이터는 ELSE 부분만 제외하고 가져오면 될듯한데요.
(어떤 row 들이 매치가 되는지 쉽게 식별하실려면 각테이블별로 순번 컬럼들이 있어야될듯하네요.)

SELECT 
  FROM (SELECT CASE....
                           .....
                   FROM b, a
              )
 WHERE type != 'else'
        

by sm5 [2013.05.11 14:01:37]
아..제가 말씀 안드린게 있네요ㅜ A테이블이 건수가 상당한 기준정보 테이블이고요 b테이블이 건수가 적은 비교 대상 임시테이블 입니다 그러니까 추출건수는 a테이블이 기준이되면 안되고 b가 되어야 해요 죄송합니다 흑흑. 글로 쓸려니 표헌이 힘드네요 이해하시겠죠?

by sm5 [2013.05.11 14:12:16]
B테이블을 기준정보테이블인 a하고 비교해서 저 케이스별로 해당하는 건을 b테이블 기준으로 추출. 하는겁니다 추출건수는 b테이블 건수 만큼 이겠죠 ㅜ

by 아린 [2013.05.11 14:15:50]
그럼 b 테이블을 기준으로  a테이블에 케이스별로 조회되는 건수를 표시하는 건가요?

by sm5 [2013.05.11 14:22:32]
넵! 맞습니다 추출형식은 건수가 아닌 각 케이스별로 해당하는 a테이블 데이타,b테이블 데이타가 나와야 해요

by 아린 [2013.05.11 14:20:19]
WITH b(key, a1, a2, a3) AS(
SELECT '1', 1, 2, 3 FROM dual UNION ALL
SELECT '2', 1, 2, 4 FROM dual
), a(key, b1, b2, b3) AS(
SELECT '1', 1, 2, 4 FROM dual UNION ALL
SELECT '2', 1, 2, 6 FROM dual UNION ALL
SELECT '3', 6, 2, 3 FROM dual UNION ALL
SELECT '4', 9, 9, 9 FROM dual UNION ALL
SELECT '5', 1, 2, 3 FROM dual
)
SELECT b.key
     , SUM(CASE WHEN a1  = b1 AND a2  = b2 AND a3 != b3 THEN 1 END) case1 
     , SUM(CASE WHEN a1  = b1 AND a3  = b3 AND a2 != b2 THEN 1 END) case2
     , SUM(CASE WHEN a2  = b2 AND a3  = b3 AND a1 != b1 THEN 1 END) case3
     , SUM(CASE WHEN a2 != b2 AND a3 != b3 AND a1 != b1 THEN 1 END) case4
  FROM b, a
 GROUP BY b.key 

by 아린 [2013.05.11 14:29:42]
테이블별 데이터와 원하시는 결과를 올려주시는게 더 빠를듯 하네요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입