안녕하세요 중복데이터 삭제건 때문에 질문을 드립니다.
identity 값중 max 값을 제외하고 중복된 데이터 삭제.. 머 이런식으로 예제가 나와있더라구여..
근데 제가 해야 할 건. 그것보다 좀 복잡합니다.
머리가 안좋아서 쿼리 구현이 안되네여. ㅠㅜ.
일단 간단하게 설명을 드리면 이러합니다.
A 테이블..
idx code itemid
1 AAA NULL
2 AAA SP110
3 AAA NULL
4 AAB NULL
5 AAB SP111
6 AAC NULL
7 AAD SP112
이렇게 데이터가 있다면,
code 값이 1개가 아닌경우
itemid 값이 NULL 이 아닌것을 남겨놓구 중복데이터를 삭제해야 합니다.
다 NULL 인경우, 아무값이나 남겨도 상관없습니다.
code 값이 1개인 경우 그대로 남깁니다.
결과로는 아래와 같이 나와야 합니다.
idx code itemid
2 AAA SP110
5 AAB SP111
6 AAC NULL
7 AAD SP112
서브쿼리로 될거 같은데.. 구현이 안되네여.. ㅠㅜ.
DELETE A WHERE idx NOT IN
(SELECT MAX(idx) FROM A GROUP BY code)
이거를 이용하면 될것 같은데... 아 머리가 나빠서 어떻게 응용을 해야 할지.. ㅠㅜ.
도움을 부탁합니다.
Comment 4
-
sams
2014.05.08 17:27
-
Hisory
2014.05.08 17:31
Declare @code varchar(10)
Declare @itemid varchar(10)
while
(
select count(*)
from
(
Select code , itemid
from 테이블
group by code , itemid
having Count(*) > 1
) as tmp > 0
) Begin
Select top 1 @code = code , @itemid = itemid
from 테이블
group by code , itemid
having Count(*) > 1Delete Top(1) From 테이블
Where code = @code
And (Case When @itemid Is Null Then itemid Is Null Else itemid = @itemid End)
End테스트는 해보지 않았지만 위와 같은식으로 하시면 됩니다.
-
냠냠10
2014.05.08 17:32
가능하면 하나의 쿼리로 했으면 하는데요. 그것이 안된다면 tmp 테이블 이동해서 해도 됩니다..
그런데 상황에 따라 적용할 부분들..
(
- 2개 이상인경우에는 itemid 값이 있는것만 남기고 다른 데이터 제거
- 2개 이상이고 itemid 가 다 NULL 인 경우 아무거나 하나만 남기고 나머지 데이터 제거
- 1개인 경우에는 제거 안함
)
이 규칙을 적용한 쿼리를 만들려고 하다 보니 코드를 어떻게 해야 할지 전혀 감이 안오고 있습니다.
-
냠냠10
2014.05.08 17:32
아 감사합니다.
delete 를 항상 저런 조건으로 수행해야 하는...쿼리가 필요하신 건가요? 아니라면
그냥 원하지 않는값을 제외한 값을 (즉 delete가 수행 된 이후 나와야 할 결과값) 쿼리로 뽑아서 tmp 테이블에 담아두고
truncate 한 이후에 그대로 다시 담으면 정리가 되지 않을까요 ?