Как я могу снимать дублированные линии?

Каков лучший способ, чтобы снимать дублированные линии достаточно большой таблицы? (Например более чем 300.000 линий)

Конечно, линии не будут совершенными дубликатами ввиду существования поля тождества ROWID

MyTable
-----------
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

Первоначальный вопрос: How хан I remove удвойся rows?

5
задан 23.05.2017, 15:39
2 ответа

Прежде всего, ты нуждаешься в том, чтобы решить, который будет твоим критерием двойственности. Например, я хочу оценить, если вторая (col1) и третья (col2) колонна целиком повторяется.

Сначала восходи к доказательству

insert into MyTable
values (1,4533660,1,'COMPANY 1')
insert into MyTable
values (2,4533660,1,'COMPANY 1')
insert into MyTable
values (3,954189547,1,'COMPANY 2')
insert into MyTable
values (4,954189547,1,'COMPANY 2')
insert into MyTable
values (5,3652591,1,'COMPANY 3')
insert into MyTable
values (6,4201580,1,'COMPANY 4')
insert into MyTable
values (7,3337788,1,'COMPANY 5')

Потом консультация, чтобы получать дубликаты на основании предопределенного критерия.

Select 
Col1,
Col2,
COUNT(*)
from MyTable 
group by Col1,
Col2
HAVING COUNT(*) > 1

С этой консультацией, легко ты можешь находить дубликаты, более важно, чем консультация в себе, это критерий, который ты используешь.

Если ты хочешь удалить дублированную дату (очевидно рекомендуемый, реализовывать backup или герметизировать в корпусе все в сделке), ты можешь реализовывать следующее:

DELETE A
FROM MyTable A 
INNER JOIN 
(
        SELECT ROW_NUMBER()OVER(PARTITION BY a.col1,
        a.Col2
        ORDER BY a.Col1,a.Col2)AS POS,
        a.rowID,
        a.Col3
        FROM MyTable A
        JOIN 
        (
            Select 
            Col1,
            Col2,
            COUNT(*) AS CONTADOR
            from MyTable 
            group by Col1,
            Col2
            HAVING COUNT(*) > 1
        ) TB
        ON A.col1 = TB.col1
        AND A.col2 = TB.col2
) TB_2
ON
a.ROWID = tb_2.ROWID 
and tb_2.pos > 1
8
ответ дан 01.12.2019, 08:13

Выбор состоит в том, чтобы использовать временные подмостки. Для этого:

  1. Создай временную таблицу, у которой будут не дублированные линии.
  2. Введи все линии, не удвоенные во временной таблице.
  3. Удали все реестры первоначальной таблицы.
  4. Переверни временную таблицу в первоначальной таблице.
  5. Необязательно, удали временную таблицу (он исчезнет автоматически в конце сеанса).

Код (я это не протестировал) был бы нечто похожим:

-- Los puntos 1 y 2 se podrían hacer en un solo paso: crear tabla temporal e insertar datos
INSERT INTO #tablaTemporal
SELECT DISTINCT Col1, Col2, Col3
FROM   MyTable;

-- Borrar todos los datos de la tabla original
DELETE FROM MyTable;

-- Volcar los datos no duplicados desde la tabla temporal a la original
INSERT INTO MyTable
SELECT * FROM #tablaTemporal;
2
ответ дан 01.12.2019, 08:13