Дублирование строк в SQL выводит слишком много значений - PullRequest
0 голосов
/ 21 октября 2018

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

DELETE FROM Employeetest 
WHERE employeeid IN (SELECT 
                         employeetest.*, 
                         ROW_NUMBER() OVER (PARTITION BY employeeid ORDER BY employeeid) AS rownumber 
                     FROM
                         employeetest 
                     HAVING
                         (rownumber > 1)); 

Я также сделал

SELECT
    employeetest.*, 
    ROW_NUMBER() OVER (PARTITION BY employeeid ORDER BY employeeid) AS rownumber 
FROM
    employeetest

тогда

DELETE * FROM employeetest;

Это не работает

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Я всегда использую что-то вроде этого:

delete employeetest
where  rowid in
       ( select lag(rowid) over (partition by employeeid order by null) 
         from employeetest )
0 голосов
/ 21 октября 2018

Эта логика также обычно записывается как:

delete Employeetest 
where rowid in (select max(rowid)
                from Employeetest e2
                group by e2.employeeid
               );
0 голосов
/ 21 октября 2018

вы пометили как plsql, что я понимаю ваш DB это Oracle.Таким образом, вы можете использовать rowid pseudocolumn следующим образом:

delete Employeetest t1
where rowid <
(
select max(rowid)
  from Employeetest t2 
 where t2.employeeid = t1.employeeid 
);

, если целью является удаление всех дубликатов значений employeeid.

PS Невозможно удалитьтаким образом Delete * from employeetest where ..., но возможны варианты Delete from employeetest where ... или Delete employeetest where ....

...