//중복된데이터 검색

//컬럼명 : nClientID, nModelID, nAlgType

//테이블 : MuraExceptCondition

 

select nClientID, nModelID, nAlgType, COUNT(*) AS CNT
from tbl_MuraExceptCondition
GROUP BY nClientID, nModelID, nAlgType
HAVING COUNT(*) > 1

 

//삭제

--SELECT COUNT(*)
--from tbl_MuraExceptCondition

 

DELETE tbl_MuraExceptCondition
WHERE nIndex NOT IN (
SELECT MAX(nIndex)
from tbl_MuraExceptCondition
GROUP BY nClientID, nModelID, nAlgType
)

 

//퍼온것

실제 작업시에는 대부분 unique index를 걸거나, primary key 를 걸어 놓아 그런 일이 벌어지지 않지만, 벌크로 데이터를 작업하거나 할 경우, 중복된 데이터를 보거나, 제거하고 싶을 때가 있습니다.

단순히 중복 카운트를 조회 하고 싶을 경우엔, 다음과 같이 grouping 하고 count를 세면 됩니다만,

 

테이블 명 : tbl_some_table

컬럼 명: some_id, some_nm, some_description

-- 중복 카운트
SELECT some_id, COUNT(*)
FROM tbl_some_table
GROUP BY some_id
HAVING COUNT(*) > 1;

-- 여러 컬럼의 중복 카운트
SELECT some_id, some_nm, some_description, COUNT(*)
FROM tbl_some_table
GROUP BY some_id, some_nm, some_description
HAVING COUNT(*) > 1;

 

 

 

중복된 데이터 중, 첫번째(또는 마지막) 하나만 빼고 나머지를 조회한다거나, 삭제하고 싶을 때가 있습니다. 그러한 경우 다음과 같은 inline view 로 처리할 수 있습니다. (WITH 를 사용해도 되나, 하위 버전의 SQL 일 경우에는 WITH 구문이 먹지 않죠. 응? 하위 버전은 ROW_NUMBER 가 안 먹겠네요. 아이고 배야. - 하위 버전도 inline view 를 여럿 쓰면 되긴 합니다만.)

-- 중복 데이터를 알고 싶다.
SELECT *
 FROM (
            SELECT some_id
                     , dup_idx = ROW_NUMBER() OVER (
                                   PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table (NOLOCK)
           ) tb_dup
WHERE tb_dup.dup_idx > 1;

-- 중복 데이터 기준으로 중복된 데이터를 다 조회하고 싶다.
SELECT t.*
FROM (
           SELECT some_id , dup_idx = ROW_NUMBER() OVER (
                                                 PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table (NOLOCK)
           ) tb_dup INNER JOIN tbl_some_table t (NOLOCK)
                                 ON t.some_id = tb_dup.some_id
WHERE tb_dup.dup_idx > 1;

-- 중복 데이터를 지우고 싶다!!!
DELETE tb_dup
FROM (
           SELECT some_id ,
                       dup_idx = ROW_NUMBER() OVER (
                                     PARTITION BY some_id ORDER BY some_id )
            FROM tbl_some_table
                 ) tb_dup
WHERE tb_dup.dup_idx > 1;

-- 여러 컬럼일 경우? 중복 데이터를 지우고 싶다!!!
DELETE tb_dup
  FROM (
               SELECT some_id, some_nm, some_description ,
                         dup_idx = ROW_NUMBER() OVER (
                                       PARTITION BY some_id, some_nm, some_description
                                       ORDER BY some_id, some_nm, some_description )
                 FROM tbl_some_table
              ) tb_dup
WHERE tb_dup.dup_idx > 1;

 

이것 또한 그냥 메모입니다. 하하.

 

출처 : https://withsoju.tistory.com/686

+ Recent posts