SQL 학습 7일차 LEETCODE 607. Sales Person. (EXIST, NOT EXIST)
다양성과 방향성

여행으로 재미있게 살고 엑셀로 성장하는 삶

직무강화/SQL

SQL 학습 7일차 LEETCODE 607. Sales Person. (EXIST, NOT EXIST)

LGPT 2024. 8. 24. 00:25
반응형

SQL을 계속 하다보니 약간 패턴이 보인다.

물론, 원리를 이해하고 하는 것이 더 중요하긴 한데 조금이나마 익숙해지는 듯 하다.

그렇다 보니 왜 정답이 아닐까..? 라는 것을 계속 찾게된다.

 

 

이번문제는 SalesPerson, Company, Orders 세개의 테이블을 연결하여 원하는 값을 찾는 문제다.

SalesPerson의 Sales_id와 Orders의 Sales_id를 연결할 수 있고

Company의 com_id와 Orders의 com_id를 연결할 수 있다.

 

또한, Company에 있는 name이 RED 인 것을 제외한 후 SalesPerson에서 name (이름)을 찾으면 된다.

 

SELECT s.name
FROM salesperson s
WHERE NOT EXISTS
(
    SELECT o.sales_id
    FROM Orders o
    JOIN company c ON c.com_id = o.com_id
    WHERE o.sales_id = s.sales_id and c.name = "RED")

사실, 처음에는 세개의 테이블을 연결해야 한다고 해서

SalesPerson 테이블을 첫 행으로 두고 Company와 Orders를 join으로 묶고자 했다.

그러나, join, join으로는 테이블을 만들 수 없었다.

 

그래서 확인해보니 EXISTS와 NOT EXSITS를 활용해야 한다는 걸 알 수 있었다.

EXISTS는 생각도 못하고 있었다. EXISTS는 서브쿼리가 행을 반환하는지 여부에 따라 TRUE 또는 FALSE를 반환한다고 한다.

 

그래서 XISTS를 쓸 때 보통 서브쿼리에는 SELECT 1을 사용한다고 한다. 상수를 넣어 특정 행이 존재하는지만 확인하고 실제 반환되는 값이 무엇인지 중요하지 않을 때 사용된다고 한다. SQL에서 성능을 쵲거화하고 쿼리를 간결하게 유지하는 방법 중 하나라고 한다.

 

그래서, Orders와 Company를 JOIN하되 회사 이름은 RED이고 Orders 테이블과 Salesperson 테이블의 id가 같은 여러 행들이 있는지를 확인하는 쿼리를 짰다. 글을 쓰다보니 생각이 든건데, 확실히 질문이나 해석을 작성하는 것 보다 코드를 작성하는게 훨씬 쉽고 소통하기 편하다고 느낀다.

 

물론, 아직 잘 몰라서 느리지만 한가지 확실한 건 체화가 되었을 때 정말 빨리 쉽게 일할 수 있을 것 같다는 생각이다.

한... 2주 정도 공부 하면 기본편들은 쉽게 풀 수 있지 않을까??

 

반응형