Вы ошибаетесь. Посмотрите план выполнения такого запроса. Из-за того, что в подзапросе есть условие связи на внешнюю таблицу, этот подзапрос будет "выполняться" каждый раз для нового набора значений сравниваемых полей.zVlad wrote: ↑12 Sep 2021 14:31 Фактически, да все дубликаты, кроме одного, будут удалены в первой же итерации на подзапросе, но вместе с ними будут удалены и все остальные строки за той что будет обработана первой.
...
Таким образом результат этого delete будет не предсказуемым. Таблица будет проряжена и транкейтнута случайным образом.
В принципе sp123 все уже рассказал выше. У меня под рукой нет Оракла, есть MySQL.
Code: Select all
mysql> select * from t;
+----+------+
| id | name |
+----+------+
| 1 | aaa |
| 2 | aaa |
| 3 | aaa |
| 4 | bbb |
| 5 | bbb |
| 6 | ccc |
| 7 | aaa |
+----+------+
7 rows in set (0.00 sec)
mysql> select t1.* from t t1 where t1.id > (select min(t2.id) from t t2 where t2.name = t1.name);
+----+------+
| id | name |
+----+------+
| 2 | aaa |
| 3 | aaa |
| 5 | bbb |
| 7 | aaa |
+----+------+
4 rows in set (0.00 sec)
mysql> explain select t1.* from t t1 where t1.id > (select min(t2.id) from t t2 where t2.name = t1.name);
+----+--------------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL | NULL | 7 | Using where |
| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | NULL | NULL | NULL | 7 | Using where |
+----+--------------------+-------+------+---------------+------+---------+------+------+-------------+
2 rows in set (0.00 sec)
PRIMARY is the outermost SELECT
...
For DEPENDENT SUBQUERY, the subquery is re-evaluated only once for each set of different values of the variables from its outer context.