SQL 통한 Database 관리

UNION ALL`과 `NOT EXISTS

JBS 12 2024. 8. 20. 19:05

select A.ID, B.ID from TBL1 A, TBL2 B where A.ID = B.ID UNION ALL select A.ID, NULL from TBL1 A where not exists (select 1 from TBL2 where A.ID = B.ID) UNION ALL select NULL, B.ID from TBL2  B where not exists (Select 1 from TBL1 A where B.ID = A.ID)

이 쿼리는 두 개의 테이블 `TBL1`과 `TBL2`를 비교하여, 각 테이블에서 일치하는 `ID` 값을 찾고, 일치하지 않는 `ID` 값도 각각의 테이블에서 표시하는 쿼리입니다. 이 쿼리는 `UNION ALL` 연산자를 사용하여 세 개의 서브쿼리 결과를 결합합니다.

### 쿼리 구조 설명

```sql
SELECT A.ID, B.ID
FROM TBL1 A, TBL2 B
WHERE A.ID = B.ID

UNION ALL

SELECT A.ID, NULL
FROM TBL1 A
WHERE NOT EXISTS (SELECT 1 FROM TBL2 WHERE A.ID = B.ID)

UNION ALL

SELECT NULL, B.ID
FROM TBL2 B
WHERE NOT EXISTS (SELECT 1 FROM TBL1 A WHERE B.ID = A.ID)
```

### 1. **첫 번째 SELECT**: 공통된 ID를 찾기

```sql
SELECT A.ID, B.ID
FROM TBL1 A, TBL2 B
WHERE A.ID = B.ID
```
- 이 부분은 `TBL1`과 `TBL2`에서 `ID` 값이 동일한 레코드를 찾습니다.
- 결과에는 `TBL1.ID`와 `TBL2.ID`의 값이 같을 때, 그 값을 각각의 열로 표시합니다.

### 2. **두 번째 SELECT**: `TBL1`에만 있는 ID를 찾기

```sql
SELECT A.ID, NULL
FROM TBL1 A
WHERE NOT EXISTS (SELECT 1 FROM TBL2 WHERE A.ID = B.ID)
```
- 이 부분은 `TBL1`에만 존재하고 `TBL2`에는 없는 `ID` 값을 찾습니다.
- `NOT EXISTS`를 사용하여 `TBL2`에 해당하는 `ID`가 없으면, `TBL1`의 `ID` 값을 반환하고, `TBL2`의 `ID` 자리에는 `NULL`을 채웁니다.

### 3. **세 번째 SELECT**: `TBL2`에만 있는 ID를 찾기

```sql
SELECT NULL, B.ID
FROM TBL2 B
WHERE NOT EXISTS (SELECT 1 FROM TBL1 A WHERE B.ID = A.ID)
```
- 이 부분은 `TBL2`에만 존재하고 `TBL1`에는 없는 `ID` 값을 찾습니다.
- `NOT EXISTS`를 사용하여 `TBL1`에 해당하는 `ID`가 없으면, `TBL2`의 `ID` 값을 반환하고, `TBL1`의 `ID` 자리에는 `NULL`을 채웁니다.

### 4. **UNION ALL** 사용

- `UNION ALL`은 중복을 제거하지 않고 세 개의 결과 집합을 단순히 결합합니다.
- 결과적으로 이 쿼리는 `TBL1`과 `TBL2`의 `ID`를 비교하여, 두 테이블에 모두 있는 ID, `TBL1`에만 있는 ID, `TBL2`에만 있는 ID를 모두 반환합니다.

### 최종 결과
이 쿼리의 최종 결과는 다음과 같은 형식으로 나타납니다:

| TBL1.ID | TBL2.ID |
|---------|---------|
| 1       | 1       |  -- `TBL1`과 `TBL2`에 모두 있는 ID
| 2       | NULL    |  -- `TBL1`에만 있는 ID
| NULL    | 3       |  -- `TBL2`에만 있는 ID

이 쿼리는 `FULL OUTER JOIN`을 직접 사용하지 않고, `UNION ALL`과 `NOT EXISTS`를 활용하여 비슷한 결과를 도출하는 예제입니다. `TBL1`과 `TBL2` 간의 관계에서 공통된 ID뿐만 아니라, 각 테이블에만 존재하는 ID를 모두 포함하여 결과를 보여줍니다.

'SQL 통한 Database 관리' 카테고리의 다른 글

LEFT OUTER JOIN`  (0) 2024.08.20
레코드 와 칼럼 차이  (0) 2024.08.20
where not exists  (0) 2024.08.20
left outer join  (0) 2024.08.20
cube()  (0) 2024.08.20