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

Seungkyu Kim님의 프로필 이미지
Seungkyu Kim

작성한 질문수

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

[백문이불여일타] 데이터 분석을 위한 고급 SQL | [심화] DELETE 문제풀이 + DELETE with INNER JOIN

작성

·

301

0

단계: [백문이불여일타] 데이터 분석을 위한 고급 SQL 
수업명:[심화] DELETE 문제풀이 + DELETE with INNER JOIN

런타임:10분 24초

아래 사진 첨부

강사님께서 적어주신

where p1.Id>p2.Id코드의 의미는 p1의 Id가 p2의 Id보다 큰 열을 지운다는 의미입니다만. 
제가 빨간 표시 해둔 부분은 p1과 p2과 같습니다. 

- p1의 Id가 p2의 Id보다 큰 열을 지운다는 코드에서
- 어떻게 p1이 p2와 같은열이
삭제가 될 수 있는지 여쭤보고싶습니다.

답변 3

1

윤선미님의 프로필 이미지
윤선미
지식공유자

안녕하세요~

아래와 같이 나누어서 생각하시면 좀 더 편하게 이해하실 수 있을 것 같네요.

1. JOIN과 WHERE를 이용해서 p1.Id = 3 이라는 삭제의 대상이 되는 값을 찾는다.

2. p1.Id = 3인 모든 데이터를 DELETE p1 을 이용해 p1 테이블에서 찾아서 삭제해준다라고 이해하시면 됩니다 :)

조인이 된 결과물에서 DELETE가 작동하는 것이 아니라, 조인은 p1.Id = 3을 찾기 위해 도구로 이용을 한 것이고, 실제 데이터 삭제는 p1 테이블에서 이루어집니다.

좋은 질문 감사합니다.

0

Seungkyu Kim님의 프로필 이미지
Seungkyu Kim
질문자

궁금한 점이 있습니다. 

1. 강사님 답변에 아래와 같이 남겨주셨습니다. 

위에 p1와 p2를 조인한 결과에서 WHERE p1.Id > p2.Id 로 필터링을 하게 되면 아래와 같은 결과가 나오고,

p1.Id    p1.Email                          p2.Id    p2.Email
3            john@example.com   1            john@example.com 

"

결국

2. "3            john@example.com   1            john@example.com " 만 지워준다면 아래와 같은 결과가 남게 되고 

p1.Id    p1.Email                          p2.Id    p2.Email
1            john@example.com   1            john@example.com
1            john@example.com   3            john@example.com
2           bob@example.com    2            bob@example.com
3           john@example.com    3           john@example.com

3.  가장 작은 unique한 id값만 남지 않게되는 결과가 나오는데 어떻게 답이 될 수 있는지 궁금합니다.

0

canary4651님의 프로필 이미지
canary4651
지식공유자

안녕하세요 Seungkyu Kim님! 

해상 강의는 해설 내용 중 정정해야할 부분이 있어서 강의 영상 하단에 안내가 되었습니다. 

영상에서 해설해드린 쿼리는 p1.Id 가 p2.Id 보다 큰 경우,
그러니까 같은 이메일을 가지지만 Id가 다른 데이터보다 큰 로우들을 찾아 삭제합니다.

중요한 포인트는 같은 이메일이 반복되면, 제일 작은 Id 이외의 다른 Id를 찾아주고 이 값을 삭제해야하는 것입니다. 

테이블을 Email을 기준으로 조인하게 된다면 아래처럼 보여지는데, 

p1.Id    p1.Email                          p2.Id    p2.Email
1            john@example.com   1            john@example.com
1            john@example.com   3            john@example.com
2           bob@example.com    2            bob@example.com
3           john@example.com    1            john@example.com
3           john@example.com    3           john@example.com

위에 p1와 p2를 조인한 결과에서 WHERE p1.Id > p2.Id 로 필터링을 하게 되면 아래와 같은 결과가 나오고,

p1.Id    p1.Email                          p2.Id    p2.Email
3            john@example.com   1            john@example.com 

DELETE는 p1을 기준으로 하고 있기 때문에 Person 테이블에서 Id가 3번인 데이터를 찾아 지웁니다.

추가 해설이 문제를 이해하는데 도움이 되길 바라며, 혼선을 드려 죄송합니다.

감사합니다!

Seungkyu Kim님의 프로필 이미지
Seungkyu Kim

작성한 질문수

질문하기