Удалите дублирующиеся записи из таблицы SQL без первичного ключа

Ни один из приведенных вами примеров не создает QTextStream то, что вы есть. QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag) не существует, используйте QTextStream s1(&file), вы уже установили режим открытия в QFile.

Кроме того, я заметил, что если я добавлю тест, чтобы проверить, было ли открытие файла успешным, я получу предупреждение «Отказано в доступе», даже если я просто читаю. Хотя я могу читать содержимое папки и даже заполнять QListWidget этими файлами без проблем.

Если у вас есть доступ к папке, это не значит, что вы можете прочитать содержимое файла. Если у вас есть права на чтение, и они представляют собой простые текстовые файлы, вы сможете открыть их в текстовом редакторе. Вы можете?

50
задан abatishchev 15 July 2010 в 20:47
поделиться

7 ответов

Добавьте первичный ключ (код ниже)

Выполните правильное удаление (код ниже)

Подумайте, ПОЧЕМУ вы не хотите сохранять этот первичный ключ.


Предполагая MSSQL. или совместимый:

ALTER TABLE Employee ADD EmployeeID int identity(1,1) PRIMARY KEY;

WHILE EXISTS (SELECT COUNT(*) FROM Employee GROUP BY EmpID, EmpSSN HAVING COUNT(*) > 1)
BEGIN
    DELETE FROM Employee WHERE EmployeeID IN 
    (
        SELECT MIN(EmployeeID) as [DeleteID]
        FROM Employee
        GROUP BY EmpID, EmpSSN
        HAVING COUNT(*) > 1
    )
END
54
ответ дан 7 November 2019 в 10:29
поделиться

Я не эксперт по SQL, так что несите меня . Я уверен, что вы скоро получите лучший ответ. Вот как можно найти повторяющиеся записи.

select t1.empid, t1.empssn, count(*)
from employee as t1 
inner join employee as t2 on (t1.empid=t2.empid and t1.empssn = t2.empssn)
group by t1.empid, t1.empssn
having count(*) > 1

Удалить их будет сложнее, потому что в данных нет ничего, что можно было бы использовать в операторе удаления для различения дубликатов. Я подозреваю, что ответ будет включать row_number () или добавление столбца идентификаторов.

0
ответ дан 7 November 2019 в 10:29
поделиться

Вы можете создать временную таблицу #tempemployee , содержащую выбрать отдельный из вашей таблицы employee . Затем удалите из сотрудника . Затем вставьте в выбор сотрудника из #tempemployee .

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

6
ответ дан 7 November 2019 в 10:29
поделиться

Используйте номер строки, чтобы различать повторяющиеся записи. Сохраните номер первой строки для EmpID / EmpSSN и удалите остальные:

    DELETE FROM Employee a
     WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
                               FROM Employee b
                              WHERE a.EmpID  = b.EmpID
                                AND a.EmpSSN = b.EmpSSN )
22
ответ дан 7 November 2019 в 10:29
поделиться
select t1.* from employee t1, employee t2 where t1.empid=t2.empid and t1.empname = t2.empname and t1.salary = t2.salary
group by t1.empid, t1.empname,t1.salary having count(*) > 1
-1
ответ дан 7 November 2019 в 10:29
поделиться

Если вы не хотите создавать новый первичный ключ, вы можете использовать команду TOP в SQL Server:

declare @ID int
while EXISTS(select count(*) from Employee group by EmpId having count(*)> 1)
begin
    select top 1 @ID = EmpId
    from Employee 
    group by EmpId
    having count(*) > 1

    DELETE TOP(1) FROM Employee WHERE EmpId = @ID
end
2
ответ дан 7 November 2019 в 10:29
поделиться
create unique clustered index Employee_idx
on Employee ( EmpId,EmpSSN )
with ignore_dup_key

Вы можете удалить индекс, если он вам не нужен.

0
ответ дан 7 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

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