Coding Challenges/LeetCode

[SQL50] 584. Find Customer Referee

기록해연 2025. 2. 7. 10:09

난이도: EASY

 

문제

더보기

Table: Customer
+-------------+--------------+
| Column Name | Type | 
+-------------+--------------+
| id                | int          |
| name         | varchar   |
| referee_id  | int           |
+-------------+--------------+

In SQL, id is the primary key column for this table.
Each row of this table indicates the id of a customer, their name, and the id of the customer who referred them.
Find the names of the customer that are not referred by the customer with id = 2.
Return the result table in any order. 
The result format is in the following example.

 

Example 1:
Input: 
Customer table:
+----+------+---------------+
| id | name | referee_id |
+----+------+---------------+
| 1  | Will    | null           |
| 2  | Jane  | null           |
| 3  | Alex   | 2               |
| 4  | Bill     | null           |
| 5  | Zack  | 1               |
| 6  | Mark  | 2               |
+----+------+---------------+

Output: 
+--------+
| name |
+--------+
| Will    |
| Jane  |
| Bill     |
| Zack  |
+--------+


 

시도 1

SELECT name
FROM Customer
WHERE referee_id IS NULL

 

문제 안 읽고 걍 널인거 찾는갑다 하고 썼다가 틀림 ㅋㅋ... 문제를 잘읽자..!


 

나의 최종 제출 답안:

SELECT name
FROM Customer
WHERE referee_id IS NULL
OR referee_id <> 2

 

이지피지....


 

chatGPT에게 더 간단하고 효율적이게 수정해달라고 요청한 답안:

 

🔥 더 효율적인 방법 (INDEX를 활용하기 위한 방법)

1️⃣ EXISTS를 활용한 방법

SELECT name
FROM Customer C
WHERE NOT EXISTS (
    SELECT 1 FROM Customer 
    WHERE referee_id = 2 AND C.referee_id = 2
);

 

✅ 장점:

  • EXISTS를 사용하면 서브쿼리가 TRUE를 반환하는 즉시 멈출 수 있어 성능이 더 나을 수 있습니다.
  • 특히 Customer 테이블이 크다면 INDEX를 활용하기 쉬워 최적화될 가능성이 큽니다.

2️⃣ CASE를 활용한 방법

SELECT name
FROM Customer
WHERE CASE 
    WHEN referee_id IS NULL THEN 1
    WHEN referee_id <> 2 THEN 1
    ELSE 0
END = 1;

 

✅ 장점:

  • CASE를 사용하면 NULL 비교 연산을 더 명확하게 처리할 수 있습니다.
  • 하지만 실행 계획에 따라 성능 차이가 클 수 있습니다.

🚀 결론: 가장 효율적인 방법은?

1️⃣ 가장 추천하는 방법: 기존 WHERE referee_id IS NULL OR referee_id <> 2를 유지하는 것이 가장 인덱스를 잘 활용하는 방법.
2️⃣ NVL(referee_id, 0) <> 2는 인덱스 최적화가 어렵기 때문에 비추.
3️⃣ 테이블이 크다면 EXISTS를 활용하여 최적화 시도 가능.
4️⃣ 복잡한 경우 CASE 문을 활용할 수도 있지만, 기본적인 WHERE 절이 더 효율적일 가능성이 높음.

💡 즉, 기존 쿼리가 가장 효율적이며, NVL 사용은 오히려 성능 저하 가능성이 큽니다! 🚀

'Coding Challenges > LeetCode' 카테고리의 다른 글

[Java] 21. Merge Two Sorted Lists  (1) 2025.02.07
[SQL50] 595. Big Countries  (0) 2025.02.07
[SQL50] 1757. Recyclable and Low Fat Products  (0) 2025.02.06
[Java] 20. Valid Parentheses  (0) 2025.02.06
[Java] 14. Longest Common Prefix  (3) 2025.02.05