
테이블A와 테이블B가 있을 때 A에만 있는데이터를 조회하고 싶다면 차집합 개념을 사용하면 된다.
MINUS연산자를 통해 아주 간단하게 차집합을 구할 수 있다.SELECT column1, column2 FROM table1
MINUS
SELECT column1, column2 FROM table2
MINUS연산자가 없기에 LEFT JOIN 과 IS NULL 필터링을 사용해야 한다. SELECT
INS.NAME
FROM
table1 as t1 LEFT JOIN table2 as t2
ON t1.column1 = t2.column2
"""
LEFT JOIN 했을 때 오른쪽 테이블이 NULL인 부분이 왼쪽 테이블에만 있는 데이터니까
WHERE 절 IS NULL 필터링을 통해 ORACLE SQL의 MINUS 성능을 구현한다.
"""
WHERE t2.column2 IS NULL
"동물 보호 시작테이블과 동물 보호 종료테이블이 있다. 계속 보호중인 동물의 ID와 보호 시작 날짜를 조회하라"
동물 보호 시작 테이블| ID | IN_DATE |
|---|---|
| A01 | 2024-01-01 |
| A02 | 2024-01-03 |
| A03 | 2024-01-05 |
| A04 | 2024-01-07 |
| A05 | 2024-01-10 |
| A06 | 2024-01-12 |
| A07 | 2024-01-15 |
| A08 | 2024-01-17 |
| A09 | 2024-01-20 |
| A10 | 2024-01-22 |
동물 보호 종료 테이블| ID | OUT_DATE |
|---|---|
| A01 | 2024-01-04 |
| A03 | 2024-01-06 |
| A05 | 2024-01-11 |
| A06 | 2024-01-13 |
| A08 | 2024-01-18 |
| A10 | 2024-01-23 |
LEFT JOIN을 수행한 후, 보호 종료 기록이 없는 동물을 찾습니다.
SELECT
INS.ID, INS.IN_DATE
FROM
ANIMAL_INS INS
LEFT JOIN
ANIMAL_OUTS OUTS
ON
INS.ID = OUTS.ID
WHERE
OUTS.OUT_DATE IS NULL
ORDER BY
INS.IN_DATE;
LEFT JOIN 결과

OUT_DATE 가 NULL값인 행만 골라내면 차집합의 결과와 동일한 값을 받아볼 수 있다. 