-
[LeetCode Database] #183 Customers Who Never OrderProgramming/SQL ( Oracle ) 2020. 12. 13. 20:31반응형
leetcode.com/problems/customers-who-never-order/
문제 내용 :
주문 테이블, 고객 테이블을 참조해서 주문 이력이 없는 고객의 이력만 출력
정답인 쿼리와 오답인 쿼리간의 차이점에 대해 고민을 많이 했다.
< 오답 >
1234567SELECT A.Name AS CustomersFROM (SELECT DISTINCT B.CustomerIdFROM Orders B) AA,Customers AWHERE A.Id not in AA.CustomerIdcs <정담>
1234567SELECT A.Name AS CustomersFROM Customers AWHERE A.Id not in (SELECT DISTINCT B.CustomerIdFROM Orders B)ORDER BY A.Idcs 두 쿼리 모두 not in 문법을 사용한 쿼리이다.
그러나 첫번째 쿼리는 중복된 값들이 출력되고, 두 번째 쿼리는 정답만을 출력한다.
이렇게 쿼리를 잘못 작성하는 원인이 쿼리의 실행 순서를 모르기 때문이다.
쿼리는
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 이 순서로 실행된다.
위의 오답 쿼리에서 from 문에서 두 row의 데이터가 선택되었다. (문제의 sql 스키마 참조)
두개의 row를 각각 읽으면서 where절의 조건에 부합하는 데이터들은 선택하므로, 첫 row에서 선택된 CustomerId가 Not in 인 데이터 n개 + 두 번째 row에서 선택된 CustomerId가 Not in인 데이터 n개 이렇게 해서 필요보다 많은 개수의 데이터가 출력된 것이다.
정답 쿼리에서는 정확히 where절에서 서브쿼리를 사용했기 때문에 정확한 결과가 나왔다.
쿼리 짤 때 실행 순서 꼭 생각하면서 짜기
반응형'Programming > SQL ( Oracle )' 카테고리의 다른 글
[Oracle] ORA-01747: 열명을 올바르게 지정해 주십시오 (0) 2020.12.21