인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

개발너구리님의 프로필 이미지

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 고급 SQL

DELETE 리트코드 문제풀이 + 섹션 3 서브쿼리 맛보기

196. Delete Duplicate Emails 좋은 코드 질문

작성

·

55

·

수정됨

0

DELETE A1
FROM Person A1
INNER JOIN Person A2 ON A1.email = A2.email
WHERE A1.id > A2.id;
  1. 이너조인 연습

 

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순위 이상
);
  1. 윈도우함수 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);
  1. CTE 이용

WITH CTE_NAME AS (

내부서브쿼리

)

 

DELECT

WHERE id IN ( 외부 서브 쿼리)

 

3가지를 연습해봤는데,

실무적으로는 어느 것을 더 지향하는지 (좋은코드? 클린코드?)

궁금해서 질문드립니다.

 

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.
개발너구리님께서 실무적으로 가장 좋은 SQL 중복 삭제 패턴에 대해 질문해 주셨네요.

세 가지 방법 모두 중복된 이메일을 삭제하는 기술적인 관점에서는 효과적인 접근 방법입니다. 그러나, 실무적으로 어떤 방법이 더 적합한지 또는 좋은 코드인지 판단하기 위해서는 다음과 같은 요소들을 고려할 필요가 있습니다:

  1. 가독성: 코드의 가독성은 매우 중요합니다. 나중에 다른 개발자가 코드를 이해하고 유지보수할 때 용이해야 합니다. 이 측면에서는 CTE(Common Table Expression)를 사용하는 방법이 가장 읽기 쉬운 구조를 제공합니다. CTE는 복잡한 쿼리를 단계적으로 볼 수 있게 해주고, 이름을 붙여주어 의미를 명확하게 전달할 수 있습니다.

  2. 성능: 대량의 데이터를 처리하는 경우 성능도 중요한 요소입니다. 일반적으로 내부 서브쿼리보다는 CTE 방식이 SQL 최적화기에 의해 더 최적화된 경로로 실행될 가능성이 높습니다.

  3. 유지보수성: 코드가 변경될 가능성이나 확장성이 필요할 경우 CTE 방법이 유리할 수 있습니다. 내부 로직을 명확하게 분리할 수 있어 로직 수정 시 일부만 변경해도 되는 장점이 있습니다.

종합적으로 볼 때, 가독성과 유지보수성 측면에서 CTE를 사용하는 방법을 지향하는 것이 좋습니다. 다만, 기업의 표준이나 코드 스타일 가이드에 따라 다를 수 있으니, 해당 사항도 참고하셔야 합니다.

생각해 볼 점은 직접 측정해보지 않으면 성능이 예상과 다를 수 있기 때문에, 실제로 데이터베이스 환경에서 성능 테스트를 통해 어떤 방식이 가장 효율적인지 검증하는 것이 바람직합니다.
Spring Data JPA - 참고 문서도 참조하셔서 데이터베이스 작업에 있어 더 많은 최적화와 관련된 정보들을 찾아보실 수 있습니다.