2016-06-16 1 views
0

Я новичок в использовании запросов T-SQL, и я пытался использовать разные решения, чтобы удалить повторяющиеся строки из большой таблицы (более 270 000 строк). таблица выглядит примерно так:Запрос T-SQL для удаления дубликатов из больших таблиц с использованием соединения

TableA 
----------- 
RowID int not null identity(1,1) primary key, 
Col1 varchar(50) not null, 
Col2 int not null, 
Col3 varchar(50) not null 

Строки для этой таблицы не являются совершенными дубликатами из-за существования поля идентичности RowId. Вторая таблица, что мне нужно присоединиться:

TableB 
----------- 
RowID int not null identity(1,1) primary key, 
Col1 int not null, 
Col2 varchar(50) not null 

В TableA у меня есть что-то вроде:

1 | gray | 4  | Angela 
2 | red | 6  | Diana 
3 | black| 6  | Alina 
4 | black| 11 | Dana 
5 | gray | 4  | Angela 
6 | red | 12 | Dana 
7 | red | 6  | Diana 
8 | black| 11 | Dana 

И в TableB:

1 | 6 | klm 
2 | 11 | lmi 

Второй столбец из TableB (Col1) является внешним ключом внутри TableA (Col2). Мне нужно удалить ТОЛЬКО дубликатов из TableA, в которых Col2 = 6 игнорирует другие дубликаты.

1 | gray | 4  | Angela 
    2 | red | 6  | Diana 
    4 | black| 6  | Alina 
    5 | black| 11 | Dana 
    6 | gray | 4  | Angela 
    7 | red | 12 | Dana 
    8 | black| 11 | Dana 

Я попытался с помощью

DELETE FROM TableA a inner join TableB b on a.Col2=b.Col1 
WHERE a.RowId NOT IN (SELECT MIN(RowId) FROM TableA GROUP BY RowId, Col1, Col2, Col3) and b.Col2="klm" 

, но я все еще получаю некоторые из дублей, что мне нужно удалить.

Каков наилучший способ удаления нечетких повторяющихся строк с помощью соединения?

ответ

0

хорошо мин будет только одна и группа по ПК даст вам все
и RowID неправы в примере

DELETE FROM TableA a 
inner join TableB b 
     on a.Col2=b.Col1 
WHERE a.RowId NOT IN (SELECT MIN(RowId) 
         FROM TableA GROUP BY RowId, Col1, Col2, Col3) 
and b.Col2="klm" 

это будет строки для удаления

select * 
from 
( select * 
     , row_number over (partition by Col1, Col3 order by RowID) as rn 
    from TableA a 
    where del.Col2 = 6 
) tt 
where tt.rn > 1 
0

другое решение является:

WITH CTE AS(
       SELECT t.[col1], t.[col2], t.[col3], t.[col4], 
        RN = ROW_NUMBER() OVER (PARTITION BY t.[col1], t.[col2], t.[col3], t.[col4] ORDER BY t.[col1]) 
       FROM [TableA] t 
      ) 
      delete from CTE WHERE RN > 1 

Отношения.

Смежные вопросы