DataBase/SQL

[SQL/TABLE/COLUMN] 테이블의 성격에 따라 다른 컬럼값

PCOSPD 100LRE SCRIE4A2 2021. 1. 15. 17:48
-- 첫번째 쿼리.
SELECT o.invoice_code FROM ORDER o
	INNER JOIN ORDER_USER bot ON o.id = bot.order_id
    LEFT JOIN BILLING_BOT_MAP map ON bot.name = map.bot_name
    LEFT JOIN BILLING b ON map.biling_id = b.id
WHERE o.order_code = 'code123';

-- 두번째 쿼리.
SELECT b.invoice_code FROM ORDER o
	INNER JOIN ORDER_USER bot ON o.id = bot.order_id
    LEFT JOIN BILLING_BOT_MAP map ON bot.name = map.bot_name
    LEFT JOIN BILLING b ON map.biling_id = b.id
WHERE o.order_code = 'code123';

첫번째 쿼리와 두번째 쿼리의 차이점이 무엇일까?

두 쿼리를 수행해 보면 결과는 다음과 같다.

첫번째 쿼리의 결과
나이키11
애플3
두번째 쿼리의 결과
나이키11
아디다스2

두 테이블 모두 구매코드 'code123' 에 해당하는 청구처를 조회하고 있는데,

첫번째 쿼리와 두번째 쿼리의 결과가 다르다.

 

보면 첫번째 쿼리에서는 ORDER 테이블의 청구처를 조회 했고,

두번째 쿼리는 BILLING 테이블에서 청구처를 조회했다. 

 

두 테이블의 invoice_code 컬럼은 청구처로 정의는 같다.

그런데 왜 결과에 차이가 나는 걸까.

 

결론은 ORDER 테이블의 청구처는, 주문을 넣었을 당시의 청구처 이고,

BILLING 테이블의 청구처는 현재 주문자의 청구처 이기 때문이다.

 

같은 order_code를 'code123'으로 조회 조건을 넣었지만,

테이블 조인 과정에서 ORDER_USER를 조인한 후 BILLING 테이블을 조인 했다.

따라서 BILLING 테이블에서 조회하면 USER의 현재 청구처를 조회하게 되고,

ORDER 테이블에서 조회하면 그 주문 당시 USER의 청구처를 반환하게 된다.

 

이렇게 테이블 성격과 조인 조건이나 순서에 따라

의도와 다른값을 가져올 수 있는점을 유의 하도록 하자.