-- 첫번째 쿼리.
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의 청구처를 반환하게 된다.
이렇게 테이블 성격과 조인 조건이나 순서에 따라
의도와 다른값을 가져올 수 있는점을 유의 하도록 하자.
'DataBase > SQL' 카테고리의 다른 글
[SQL/쿼리 튜닝] 조인조건 변경을 통한 속도 개선 (0) | 2021.05.13 |
---|---|
한 컬럼에 대해서 두 개 이상의 조건을 적용하는 쿼리 (0) | 2021.05.13 |
소계 쿼리. (0) | 2021.02.03 |
[MySQL] Pivot 쿼리. (0) | 2021.02.03 |
[MySQL/SQL] update 시 테이블 조인. update table join. (0) | 2021.01.12 |