Удалить дублирующиеся записи в SQL Server?

Ваш существующий код не фактически читает входной файл в String. Вы можете сделать это с помощью ряда методов, одним из которых является Files.readAllLines(Path) , который возвращает List строк файла. Поток это, и собрать его с разделителями строк. Например,

String inputFileString = Files.readAllLines(new File(fileName).toPath()).stream()
            .collect(Collectors.joining(System.lineSeparator()));

Что касается записи в файл, взгляните на конструктор PrintStream(File) .

85
задан Unihedron 2 September 2014 в 10:36
поделиться

5 ответов

Это можно сделать с помощью оконных функций. Он упорядочит дубликаты по empId и удалит все, кроме первого.

delete x from (
  select *, rn=row_number() over (partition by EmployeeName order by empId)
  from Employee 
) x
where rn > 1;

Запустите его как select, чтобы увидеть, что будет удалено:

select *
from (
  select *, rn=row_number() over (partition by EmployeeName order by empId)
  from Employee 
) x
where rn > 1;
206
ответ дан 24 November 2019 в 08:09
поделиться
delete from person 
where ID not in
(
        select t.id from 
        (select min(ID) as id from person 
         group by email 
        ) as t
);
0
ответ дан 24 November 2019 в 08:09
поделиться

Вы можете попробовать что-то вроде следующего:

delete T1
from MyTable T1, MyTable T2
where T1.dupField = T2.dupField
and T1.uniqueField > T2.uniqueField  

(предполагается, что у вас есть уникальное поле, основанное на целых числах)

Лично я бы сказал, что вам лучше попытаться исправить тот факт, что повторяющиеся записи добавляются в базу данных до того, как это происходит, а не в качестве операции post fix-it.

8
ответ дан 24 November 2019 в 08:09
поделиться

Предполагая, что ваша таблица Employee также имеет уникальный столбец ( ID в примере ниже), будет работать следующее:

delete from Employee 
where ID not in
(
    select min(ID)
    from Employee 
    group by EmployeeName 
);

Это оставит версию с наименьшим идентификатором в таблице.

Редактировать
Комментарий МакГайвера - с SQL 2012

MIN можно использовать с числовыми, символьными, varchar, uniqueidentifier или datetime столбцами, но не с битовыми столбцами

Для 2008 R2 и ранее,

MIN можно использовать со столбцами numeric, char, varchar или datetime, но не с битовыми столбцами (и он также не работает с GUID)

Для 2008R2 вам необходимо преобразовать GUID к типу, поддерживаемому MIN , например

delete from GuidEmployees
where CAST(ID AS binary(16)) not in
(
    select min(CAST(ID AS binary(16)))
    from GuidEmployees
    group by EmployeeName 
);

SqlFiddle для различных типов в Sql 2008

SqlFiddle для различных типов в Sql 2012

33
ответ дан 24 November 2019 в 08:09
поделиться
WITH CTE AS
(
   SELECT EmployeeName, 
          ROW_NUMBER() OVER(PARTITION BY EmployeeName ORDER BY EmployeeName) AS R
   FROM employee_table
)
DELETE CTE WHERE R > 1;

Магия общих табличных выражений.

2
ответ дан 24 November 2019 в 08:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: