Sql 사용자 만 료 된 데 이 터 를 정확하게 삭제 합 니 다.

10876 단어 sql

어떻게 해야만 기한 이 지난 데 이 터 를 정확하게 삭제 하 는 것 이 라 고 할 수 있 습 니까?먼저 전 제 를 설명 하 겠 습 니 다. XX 사이트 에 안심 기업 전문 구역 이 있 습 니 다. 슈퍼 회원 을 처리 하면 안심 기업 이 될 수 있 습 니 다. 안심 기업 은 추천 직위 를 설정 하여 안심 기업 전문 구역 에 전시 할 수 있 습 니 다. 정 보 는 모두 Info 표 에 저 장 된 것 입 니 다. 추천 직위 란 정 보 를 Info 표 에서 추천 직위 표 (RecommPosition) 에 쓰 는 것 입 니 다.한편, 사용자 가 처리 하 는 슈퍼 회원 은 유효기간 이 있 습 니 다. 슈퍼 회원 을 처리 할 때 회원 처리 기록 표 (Package Record) 에 기록 을 새로 작성 합 니 다. 사용자 정 보 를 변경 하지 않 고 관련 사용자 표 와 회원 처리 기록 표를 사용 하여 이 루어 집 니 다. 이런 물건 이 많 기 때문에 일부 제품 이 적당 하지 않 으 면 도 태 됩 니 다.만약 에 새로운 제품 이 나 올 때마다 User 표 에 필드 를 추가 하여 표 지 를 하면 오 랜 시간 동안 User 표 의 필드 가 지루 하기 때문에 해당 하 는 표 와 관련 되 어 이 루어 집 니 다. 그러면 후기 유지 의 어려움 을 피 할 수 있 습 니 다.어, 본론 으로 돌아 가면 사용자 가 처리 한 슈퍼 회원 이 만기 가 되면 시스템 은 회원 이 만기 가 된 사용자 가 설정 한 추천 직위 정 보 를 자동 으로 정리 해 야 한다. 추천 직위 표 에 기 록 된 기록 은 모두 Info 표 에 기 록 된 것 이기 때문에 정 보 는 실제 적 으로 Info 표 에 저 장 된 것 이다. 추천 직위 표 는 관련 Info 표 의 Id, 전문, 지역 등 일부 정 보 를 선별 하 는 데 사 용 될 뿐이다.따라서 추천 직위 표 는 임시 표 에 해당 하 며 표 의 기록 은 물리 적 으로 삭제 할 수 있다.물론 데이터 분석 을 하려 면 논리 적 으로 삭제 할 수도 있다.
회원 이 만 료 된 사용자 가 설정 한 추천 직위 정 보 를 삭제 합 니 다:
delete [RecommPosition] where [UserId] in
(
    select [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]<GETDATE()
)

언뜻 보기 에는 아무런 문제 가 없 는 것 같 지만 저 는 문 제 를 소홀히 했 습 니 다. 회원 이 기록 표 에 기 록 된 것 은 각 회원 의 판매 상황 이기 때문에 재무 통계 와 데이터 분석 을 할 것 입 니 다. 이런 표 의 기록 은 삭제 되 지 않 기 때문에 한 사용자 가 여러 개의 기록 을 가지 고 있 는 상황 이 발생 할 수 있 기 때문에 저 는 사용자 Id 를 다시 해 야 합 니 다.만약 에 슈퍼 회원 의 유효기간 이 한 달 이 고 사용자 가 예전 에 슈퍼 회원 을 처리 한 적 이 있 습 니 다. 효과 가 괜 찮 은 것 같 아서 이번 달 에 계속 처리 하려 고 합 니 다. 이 사용 자 는 여러 개의 회원 이 기록 을 처리 합 니 다. 이런 상황 에 직면 하면 우리 위의 Sql 문 구 는 일부 사용자 의 추천 직위 를 잘못 삭제 합 니 다.만기 가 된 회원 처리 기록 도 있 고 만기 가 되 지 않 은 회원 처리 기록 도 있 는 사용 자 는 사실상 안심 기업 에 속 하기 때문이다.그래서 저 희 는 슈퍼 회원 이 만 료 되 고 슈퍼 회원 의 사용자 설정 을 계속 처리 하지 않 은 추천 직위 정 보 를 삭제 할 수 밖 에 없습니다.
슈퍼 회원 이 만 료 되 고 슈퍼 회원 의 사용자 설정 을 계속 처리 하지 않 은 추천 직위 정 보 를 삭제 합 니 다.
 
--                  .
delete [RecommPosition] where [UserId] in
(
    select distinct [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]<GETDATE()
)
and [UserId] not in
(
    select distinct [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]>=GETDATE()
)

이렇게 삭제 하 는 것 은 틀 리 지 않 습 니 다. 그러나 위의 Sql 은 not in 을 사 용 했 습 니 다. 효율 이 높 지 않 고 Sql 문 구 를 이해 하기 어렵 습 니 다. 우 리 는 최적화 방법 을 생각해 보 겠 습 니 다.
사용자 의 정 보 를 삭제 하지만 그 가 유효한 회원 처리 기록 이 있다 면 삭제 할 수 없습니다. 즉, 우 리 는 모든 만기 시간 중 가장 큰 만기 시간 이 현재 시간 보다 적은 사용자 의 추천 직위 정 보 를 삭제 할 수 밖 에 없습니다.
delete [RecommPosition] where [UserId] in
(
    select [UserId] from [PackageRecord] where [PackagePid]=1 group by [UserId] having MAX([EndTime])<GETDATE()
)

여 기 를 보면 문제 가 없 는 것 같 지만 예상 치 못 한 일이 발생 합 니 다. 어느 날 블 로 거들 은 추천 직위 표 에 비 슈퍼 회원 의 추천 정보 가 하나 더 있다 는 것 을 발 견 했 습 니 다. 이 데 이 터 를 어떻게 썼 는 지 모 르 겠 습 니 다. 그리고 이 럴 때 저 는 현재 이 sql 에서 이 비 슈퍼 회원 의 추천 정 보 를 삭제 할 수 없다 는 것 을 알 게 될 것 입 니 다.왜?저 는 슈퍼 회원 을 처리 한 적 이 있 고 슈퍼 회원 이 기한 이 지난 사용자 만 삭 제 했 기 때문에 추천 정보 가 있 지만 슈퍼 회원 이나 회원 구 매 기록 이 삭 제 된 사용자 에 게 삭 제 를 실시 할 수 없습니다. 비 특급 회원 의 추천 정보 가 있 을 줄 은 전혀 고려 하지 않 았 습 니 다. 됐 습 니 다. 빨리 sql 을 보완 하 세 요.
 
delete [RecommPosition] where [UserId] in
(
    select [UserId] from [PackageRecord] where [PackagePid]=1 group by [UserId] having MAX([EndTime])<GETDATE()
)
or [UserId] not in 
(
    select distinct UserId from [PackageRecord] where [PackagePid]=1
)

 
정확 한 이 해 는 슈퍼 회원 이 아 닌 추천 정 보 는 정리 해 야 한다. 기한 이 지난 슈퍼 회원 의 정보 뿐만 아니 라 슈퍼 회원 이나 회원 의 구 매 기록 이 삭 제 된 사용자 정보 도 포함한다.
 
자, 여기까지 쓰 면 이 블 로그 도 많 지 않 을 것 같 습 니 다. 너무 지루 하 게 쓴 것 같 습 니 다. 천천히 개선 하 세 요!
결론: 1. 문 제 를 너무 간단하게 생각 하지 말고 최대한 전면적으로 고려 하 세 요!
2. 한 걸음 만 더 생각하면 많은 것 을 얻 을 수 있 고 천천히 발전 할 수 있 습 니 다. 화 이 팅!

좋은 웹페이지 즐겨찾기