Ваш существующий код не фактически читает входной файл в String
. Вы можете сделать это с помощью ряда методов, одним из которых является Files.readAllLines(Path)
, который возвращает List
строк файла. Поток это, и собрать его с разделителями строк. Например,
String inputFileString = Files.readAllLines(new File(fileName).toPath()).stream()
.collect(Collectors.joining(System.lineSeparator()));
Что касается записи в файл, взгляните на конструктор PrintStream(File)
.
Это можно сделать с помощью оконных функций. Он упорядочит дубликаты по 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;
delete from person
where ID not in
(
select t.id from
(select min(ID) as id from person
group by email
) as t
);
Вы можете попробовать что-то вроде следующего:
delete T1
from MyTable T1, MyTable T2
where T1.dupField = T2.dupField
and T1.uniqueField > T2.uniqueField
(предполагается, что у вас есть уникальное поле, основанное на целых числах)
Лично я бы сказал, что вам лучше попытаться исправить тот факт, что повторяющиеся записи добавляются в базу данных до того, как это происходит, а не в качестве операции post fix-it.
Предполагая, что ваша таблица 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
);
WITH CTE AS
(
SELECT EmployeeName,
ROW_NUMBER() OVER(PARTITION BY EmployeeName ORDER BY EmployeeName) AS R
FROM employee_table
)
DELETE CTE WHERE R > 1;
Магия общих табличных выражений.