Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Особенности выполнения запроса DELETE / 8 сообщений из 8, страница 1 из 1
24.05.2016, 10:34
    #39241952
Interloper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
Имеется таблица TEST_TBL с числовыми полями ID и A. Требуется удалить из таблицы 5 строк с наибольшим значением поля A (будем считать, что все значения в поле A уникальны).
Тогда запрос
Код: sql
1.
DELETE FROM TEST_TBL WHERE A IN (SELECT FIRST 5 A FROM TEST_TBL ORDER BY A DESC)

удалит 6 строк, вместо указанных во вложенном запросе 5. Объясните, почему так происходит? Движок перевыполняет вложенный запрос 2 раза по какой-то причине?
...
Рейтинг: 0 / 0
24.05.2016, 10:47
    #39241967
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
Interloper,

Курсор видит изменения самого себя.
Исправлено в 3.0 CORE-3362
Ну и твой случай туда же относится. См. зависимые тикеты
...
Рейтинг: 0 / 0
24.05.2016, 12:22
    #39242084
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
InterloperДвижок перевыполняет вложенный запрос 2 раза по какой-то причине?

Не два. Подзапрос выполняется отдельно для каждой строки внешнего курсора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2016, 13:06
    #39242142
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
Interloper,

Код: plsql
1.
2.
DELETE FROM TEST_TBL
  ORDER BY A DESC ROWS 1 TO 5
...
Рейтинг: 0 / 0
24.05.2016, 13:37
    #39242179
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
Interloper,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
EXECUTE BLOCK
AS
  DECLARE VARIABLE MIN_A TYPE OF COLUMN TEST_TBL.A;
  DECLARE VARIABLE MAX_A TYPE OF COLUMN TEST_TBL.A;
BEGIN
  FOR
      SELECT FIRST 10 A
        FROM TEST_TBL
        ORDER BY A DESC
        INTO: MIN_A
    DO
      IF (:MAX_A IS NULL) THEN MAX_A = MIN_A;
  IF (:MIN_A IS NOT NULL) THEN
    DELETE FROM TEST_TBL
      WHERE A BETWEEN MIN_A AND MAX_A
END
...
Рейтинг: 0 / 0
26.05.2016, 09:51
    #39243683
Interloper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
Dimitry SibiryakovInterloperДвижок перевыполняет вложенный запрос 2 раза по какой-то причине?

Не два. Подзапрос выполняется отдельно для каждой строки внешнего курсора.


Почему в таком случае происходит удаление ровно на одну запись больше, чем ожидается? Ведь если курсор видит изменения самого себя, то после удаления каждой строки, он перевыполняет запрос и находит новых кандидатов на удаление, и так до тех пор, пока не удалятся все записи. Но удаления всех записей не происходит.
...
Рейтинг: 0 / 0
26.05.2016, 11:10
    #39243780
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
InterloperПочему в таком случае происходит удаление ровно на одну запись больше,
чем ожидается?
Так звёзды сошлись (а точнее записи на диске лежат). Например, они лежат как
1,2,3,4,5,6,7. Для записи 1 подзапрос выберет 7,6,5,4,3 и она не удалится. А если бы они
лежали как 7,6,5,4,3,2,1, то удалились бы все.

Читай http://www.ibase.ru/dataaccesspaths/ и кури план.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.05.2016, 11:35
    #39243835
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности выполнения запроса DELETE
Да сделай "execute block" как советует rdb_dev. И будет тебе счастье! И вообще зачем для удаления каждой записи выполнять селект? Только сервак напрягать.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Особенности выполнения запроса DELETE / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]