ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LeetCode Database] #183 Customers Who Never Order
    Programming/SQL ( Oracle ) 2020. 12. 13. 20:31
    반응형

    leetcode.com/problems/customers-who-never-order/

     

    Customers Who Never Order - LeetCode

    Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

    leetcode.com

     

    문제 내용 : 

    주문 테이블, 고객 테이블을 참조해서 주문 이력이 없는 고객의 이력만 출력

     

    정답인 쿼리와 오답인 쿼리간의 차이점에 대해 고민을 많이 했다. 

     

    < 오답 > 

    1
    2
    3
    4
    5
    6
    7
    SELECT A.Name AS Customers
    FROM  (
        SELECT DISTINCT B.CustomerId
        FROM Orders B
        ) AA,
        Customers A
    WHERE A.Id not in AA.CustomerId
    cs

     

    <정담>

    1
    2
    3
    4
    5
    6
    7
    SELECT A.Name AS Customers
    FROM   Customers A
    WHERE A.Id not in (
        SELECT DISTINCT B.CustomerId
        FROM Orders B
        )
    ORDER BY A.Id
    cs

     

    두 쿼리 모두 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절에서 서브쿼리를 사용했기 때문에 정확한 결과가 나왔다. 

     

     

    쿼리 짤 때 실행 순서 꼭 생각하면서 짜기 

    반응형

    댓글

Designed by Tistory.