Рассечение фактической механики:
DELETE FROM table_name A
Это стандартный запрос на удаление записей из таблицы с именем «table_name». Здесь это было псевдонимом «А», который будет упоминаться в подзапросе.
WHERE ROWID >
Это накладывает условие на удаление, так что для каждой встреченной строки ROWID должен соответствовать условию, превышающему ..
(SELECT min(rowid)
FROM table_name B
WHERE A.key_values = B.key_values)
Это подзапрос, который связан с основным оператором DELETE. Он использует значение A.key_values
из внешнего запроса. Поэтому, учитывая запись из оператора DELETE, он выполнит этот подзапрос, чтобы найти минимальный идентификатор строки (внутренний идентификатор записи) для всех записей в одной таблице (теперь с псевдонимом B), которые имеют одинаковое значение key_values
.
Итак, чтобы сложить это, скажем, у вас были эти строки
rowid | key_values
======= ============
1 A
2 B
3 B
4 C
5 A
6 B
В подзапросе выясняется, что min (rowid) для каждой записи на основе ВСЕХ записей с одинаковым key_values
равно:
rowid | key_values | min(rowid)
======= ============ ===========
1 A 1
2 B 2
3 B 2 **
4 C 4
5 A 1 **
6 B 2 **
Для записей, помеченных **
, условие
WHERE ROWID > { subquery }
становится истинным, и они удаляются.
РЕДАКТИРОВАТЬ - дополнительная информация
В этом ответе ранее говорилось, что ROWID увеличивается на порядок вставки. Это очень не соответствует действительности. Правда в том, что rowid is just a file.block.slot-on-block - a physical address
.
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:53140678334596
Tom's Продолжение 1 декабря 2008 г. - 6:00 Центральный часовой пояс:
вполне возможно, что D будет "первым" в таблице - так как он занял место А.
Если бы rowids всегда «рос», то пространство никогда бы не использовалось повторно (это было бы следствием растущего всегда rowids - мы никогда не смогли бы повторно использовать старое пространство, так как rowid - это просто file.block.slot-on- блок - физический адрес)