Зачем использовать подзапрос, чтобы получить исходную таблицу? - PullRequest
0 голосов
/ 30 января 2019

Я натолкнулся на вопрос из Leetcode.

https://leetcode.com/problems/delete-duplicate-emails/

Ниже представлен один из подходов:

DELETE FROM Person WHERE Id NOT IN (SELECT MIN(p.Id) FROM (SELECT * FROM Person) p Group by p.Email);

Интересно, почему этонужен подзапрос для самой таблицы (SELECT MIN(p.Id) FROM (SELECT * FROM Person) вместо просто (SELECT MIN(p.Id) FROM Person p)

1 Ответ

0 голосов
/ 30 января 2019

Это взлом в MySQL.MySQL не позволяет DELETE или UPDATE напрямую ссылаться на изменяемую таблицу.Дополнительный подзапрос материализует таблицу и позволяет коду работать.

Многие люди пишут это, используя JOIN вместо:

DELETE p
    FROM Person p JOIN
         (SELECT p2.email, MIN(p2.ID) as min_id
          FROM person p2
          GROUP BY p2.email
         ) pp
         ON pp.email = p.email
    WHERE p.id > pp.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...