MySQL Удалить дубликаты данных, используя подзапрос - PullRequest
0 голосов
/ 10 апреля 2020

Я хотел бы удалить дубликаты записей из таблицы учеников. Я использую MySQL сервер версии 5.7

create table student (
   sid int not null,
   sname varchar(50) not null,
   city varchar(50) not null
) ;

Удалять дублирующиеся записи с помощью самостоятельного объединения работает нормально

 delete t1 from student as t1
 inner join student as t2
 on t1.sid < t2.sid and t1.sname = t2.sname;

Удалять дублирующиеся записи с помощью подзапроса не работает

delete s1 from student
where sid > (select sid from (select min(sid) from student s2 
where s2.sname = sname) as t); 

Я попробовал инструкцию, упомянутую в ссылке ниже, также

Удалить дублирующиеся строки, используя подзапрос

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Ваш метод подзапроса не работает, потому что ваш второй вложенный запрос

select min(sid) from student s2 where s2.sname = sname

не ссылается на таблицу, из которой вы хотите удалить, т.е. sname в s2.sname = sname ссылается на ту же таблицу s2 таким образом, подзапрос такой же, как

select min(sid) from student s2 where s2.sname = s2.sname

Если вы хотите придерживаться метода подзапроса, вам следует использовать производную таблицу , например, так:

DELETE FROM
   student
WHERE EXISTS ( 
   SELECT 1 FROM (SELECT * FROM student) AS s2
     WHERE s2.sname = student.sname AND student.sid > s2.sid)
0 голосов
/ 10 апреля 2020

Палка с версией join. Проблема с версией подзапроса заключается в том, что MySQL не распознает предложения корреляции, вложенные более чем в один уровень.

Это затрудняет построение запроса. Хотя это и возможно, оно того не стоит. Вы знаете правильный подход в MySQL. И вложенные подзапросы - это действительно хак, чтобы обойти ограничения MySQL, которые не нужны в других базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...