196. Delete Duplicate Emails 좋은 코드 질문
DELETE A1
FROM Person A1
INNER JOIN Person A2 ON A1.email = A2.email
WHERE A1.id > A2.id;이너조인 연습
DELETE FROM Person --삭제
WHERE id IN (
SELECT id --외부 서브쿼리
FROM (
SELECT id, --내부 서브쿼리
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as id_rank
FROM Person
) Number_Practice
WHERE id_rank > 1 --외부조건 2순위 이상
);윈도우함수 Row_number 활용
PARTITION BY - 그룹
ORDER BY - 순위 (id)
WITH CTE_practice AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as id_rank
FROM Person
)
DELETE FROM Person
WHERE id IN (SELECT id FROM CTE_practice WHERE id_rank > 1);CTE 이용
WITH CTE_NAME AS (
내부서브쿼리
)
DELECT
WHERE id IN ( 외부 서브 쿼리)
3가지를 연습해봤는데,
실무적으로는 어느 것을 더 지향하는지 (좋은코드? 클린코드?)
궁금해서 질문드립니다.
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
개발너구리님께서 실무적으로 가장 좋은 SQL 중복 삭제 패턴에 대해 질문해 주셨네요.
세 가지 방법 모두 중복된 이메일을 삭제하는 기술적인 관점에서는 효과적인 접근 방법입니다. 그러나, 실무적으로 어떤 방법이 더 적합한지 또는 좋은 코드인지 판단하기 위해서는 다음과 같은 요소들을 고려할 필요가 있습니다:
가독성: 코드의 가독성은 매우 중요합니다. 나중에 다른 개발자가 코드를 이해하고 유지보수할 때 용이해야 합니다. 이 측면에서는 CTE(Common Table Expression)를 사용하는 방법이 가장 읽기 쉬운 구조를 제공합니다. CTE는 복잡한 쿼리를 단계적으로 볼 수 있게 해주고, 이름을 붙여주어 의미를 명확하게 전달할 수 있습니다.
성능: 대량의 데이터를 처리하는 경우 성능도 중요한 요소입니다. 일반적으로 내부 서브쿼리보다는 CTE 방식이 SQL 최적화기에 의해 더 최적화된 경로로 실행될 가능성이 높습니다.
유지보수성: 코드가 변경될 가능성이나 확장성이 필요할 경우 CTE 방법이 유리할 수 있습니다. 내부 로직을 명확하게 분리할 수 있어 로직 수정 시 일부만 변경해도 되는 장점이 있습니다.
종합적으로 볼 때, 가독성과 유지보수성 측면에서 CTE를 사용하는 방법을 지향하는 것이 좋습니다. 다만, 기업의 표준이나 코드 스타일 가이드에 따라 다를 수 있으니, 해당 사항도 참고하셔야 합니다.
생각해 볼 점은 직접 측정해보지 않으면 성능이 예상과 다를 수 있기 때문에, 실제로 데이터베이스 환경에서 성능 테스트를 통해 어떤 방식이 가장 효율적인지 검증하는 것이 바람직합니다.
Spring Data JPA - 참고 문서도 참조하셔서 데이터베이스 작업에 있어 더 많은 최적화와 관련된 정보들을 찾아보실 수 있습니다.
순위 함수 연습 문제 - 스테디셀러 작가 찾기
0
83
1
문제 내용이 잘못된 것 같습니다.
0
57
2
서브쿼리 질문
0
59
2
[수업질문] 서브쿼리 > null데이터 avg사용 주의
0
71
1
서브쿼리는 언제 작성하는건가요?
0
66
1
안녕하세요 질문드립니다.
0
66
2
Top Earners 문제관련 질문
0
95
2
고급반 cheetsheet
0
145
2
a.id = 1과 b.id=1이 없어도 되는 이유
0
125
0
강의 플랫폼
0
197
3
리트코드 177번 function 풀이중 case when 활용을 위한 서브쿼리 구문을 제출 시 검증에 통과되지 않도록 보강된 듯 하네요
0
203
2
ERD 읽는법에 추가 질문 있어요
0
249
1
lead, lag로 풀이할 시 id 값이 존재하지 않는 경우의 오답
0
355
2
사용자정의함수
0
230
1
이 문제 inner join이 이해가 안됩니다.
0
294
1
평균 함수 사용할 때 주의점과 해결법
0
259
1
196. subquery로 풀 때, 궁금한 점
0
381
2
쿼리성능 질문드립니다.
0
311
1
리트코드 highest department salary 문제
0
257
2
The report 문제 order by부분 질문
0
268
2
리트코드 서브쿼리 문제 질문
0
418
1
DEPARTMENT HIGHEST SALARY 서브쿼리 문제 문의
0
233
1
서브쿼리의 활용사례 및 조인관련질문
0
281
1
count(*)과 AS가 사용가능한절 TOP EARNERS문제
0
250
2





