개발은 재밌어야 한다
article thumbnail

데이터베이스 개발 및 운영 중 두 쿼리의 결과가 동일한지 또는 차이가 나는지 확인해야 하는 경우가 자주 발생합니다.

예를 들어:

  • 코드 최적화: 비슷한 쿼리지만, 더 효율적인 방법을 찾고자 할 때
  • 데이터 정합성 확인: 서로 다른 시스템에서 수집된 데이터의 일관성을 검토하고자 할 때

이러한 상황에서 오라클에서 쿼리 비교를 할 수 있는 다양한 방법을 살펴보겠습니다.

 

오라클에서 두 쿼리 비교 방법

오라클에서는 두 쿼리의 결과를 비교하기 위한 몇 가지 방법이 있습니다. 각각의 방법을 예제를 통해 자세히 알아보겠습니다.

1) MINUS 연산자

MINUS 연산자는 두 개의 SELECT 쿼리 결과에서 차이 나는 행만을 반환합니다.

  • 쿼리 A MINUS 쿼리 B는 쿼리 A에는 있지만 쿼리 B에는 없는 데이터를 보여줍니다.
  • 반대로, 쿼리 B MINUS 쿼리 A를 실행하면 쿼리 B에는 있지만 쿼리 A에는 없는 데이터를 찾을 수 있습니다.

예제 테이블 데이터

  • PRODUCT_A 테이블:

PRODUCT_IDPRODUCT_NAME

1 Apple
2 Banana
3 Cherry
4 Date
  • PRODUCT_B 테이블:

PRODUCT_IDPRODUCT_NAME

2 Banana
3 Cherry
4 Dragonfruit
5 Elderberry

 

-- PRODUCT_A에는 있지만 PRODUCT_B에는 없는 데이터
SELECT PRODUCT_ID, PRODUCT_NAME FROM PRODUCT_A
MINUS
SELECT PRODUCT_ID, PRODUCT_NAME FROM PRODUCT_B;

결과:

PRODUCT_IDPRODUCT_NAME

1 Apple

 

RODUCT_A 테이블에만 존재하는 Apple 항목을 확인할 수 있습니다.

-- PRODUCT_B에는 있지만 PRODUCT_A에는 없는 데이터
SELECT PRODUCT_ID, PRODUCT_NAME FROM PRODUCT_B
MINUS
SELECT PRODUCT_ID, PRODUCT_NAME FROM PRODUCT_A;

결과:

PRODUCT_IDPRODUCT_NAME

4 Dragonfruit
5 Elderberry

PRODUCT_B에만 존재하는 Dragonfruit Elderberry 항목이 나타납니다.

 

JOIN을 이용한 비교

두 쿼리의 결과를 JOIN으로 비교하여 차이 나는 레코드를 찾는 방법입니다. 특히, FULL OUTER JOIN을 사용하여 두 쿼리의 데이터 간의 차이점을 명확히 볼 수 있습니다.

SELECT 
    A.PRODUCT_ID AS A_PRODUCT_ID, 
    A.PRODUCT_NAME AS A_PRODUCT_NAME, 
    B.PRODUCT_ID AS B_PRODUCT_ID, 
    B.PRODUCT_NAME AS B_PRODUCT_NAME
FROM PRODUCT_A A
FULL OUTER JOIN PRODUCT_B B ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE A.PRODUCT_NAME IS NULL OR B.PRODUCT_NAME IS NULL;

결과:

1 Apple NULL NULL
NULL NULL 5 Elderberry
4 Date 4 Dragonfruit
  • Apple은 PRODUCT_A에만 존재하며,
  • Elderberry는 PRODUCT_B에만 존재합니다.
  • Date Dragonfruit는 PRODUCT_ID가 동일하지만 PRODUCT_NAME 값이 다릅니다.

 

WITH 절을 사용한 서브쿼리 비교

WITH 절을 사용해 서브쿼리로 저장한 데이터를 비교할 수 있습니다. 이렇게 하면 중복 코드를 줄이고 가독성을 높일 수 있습니다.

WITH A AS (
    SELECT PRODUCT_ID, PRODUCT_NAME FROM PRODUCT_A
),
B AS (
    SELECT PRODUCT_ID, PRODUCT_NAME FROM PRODUCT_B
)
SELECT 
    A.PRODUCT_ID AS A_PRODUCT_ID, 
    A.PRODUCT_NAME AS A_PRODUCT_NAME, 
    B.PRODUCT_ID AS B_PRODUCT_ID, 
    B.PRODUCT_NAME AS B_PRODUCT_NAME
FROM A 
FULL OUTER JOIN B ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE A.PRODUCT_NAME IS NULL OR B.PRODUCT_NAME IS NULL;

 

profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!