Страница 1 из 2
не работает delete с подзапросом на эту же таблицу
Добавлено: 08 авг 2006, 10:05
KSilver
Код: Выделить всё
select
id,
id_reorg,
numreg
from
reorg1
where
id_reorg in (select distinct(r1.id_reorg) from reorg1 r1 where r1.numreg = '137011294')
- выдает 6 записей
ID ID_REORG NUMREG
352 1000010680 137020336
355 1000010680 137020343
354 1000010680 137020350
353 1000010680 137011294
6447 1000013728 137007100
6446 1000013728 137011294
а запрос
Код: Выделить всё
delete from
reorg1
where
id_reorg in (select distinct(r1.id_reorg) from reorg1 r1 where r1.numreg = '137011294')
удаляет только 4
остаются нетронутыми записи
354 1000010680 137020350
6447 1000013728 137007100
хотя явный
Код: Выделить всё
delete from
reorg1
where
id_reorg in (1000010680, 1000013728)
удаляет все 6 записей
база диалект 1
FB 1.0
ps пробовал на FB 1.5, так там вообще только 3 записи удаляются
Добавлено: 08 авг 2006, 10:38
Ivan_Pisarevsky
Код: Выделить всё
select id, id_reorg, numreg from reorg1 where id_reorg in
(select distinct(r1.id_reorg) from reorg1 r1 where r1.numreg = '137011294')
Будь проще, и люди у тебе потянутся.
Код: Выделить всё
select r1.id, r1.id_reorg, r1.numreg from reorg r1 where r1.numreg = '137011294'
C delete аналогично.
Если нет разницы, зачем платить больше?
Добавлено: 08 авг 2006, 10:42
KSilver
Код: Выделить всё
select r1.id, r1.id_reorg, r1.numreg from reorg r1 where r1.numreg = '137011294'
выдаст только 2 записи
353, 6446
Ivan_Pisarevsky невнимательно просмотрели код
Добавлено: 08 авг 2006, 11:12
WildSery
Не подтверждаю.
Создал табличку, вписал эти шесть записей. И указанный тобой селект возвращает все 6, и делит убивает тоже 6.
Dialect 1, FB 1.0.3
Это у тебя настоящий запрос, который пользуешь, без упрощения?
Добавлено: 08 авг 2006, 12:27
KSilver
WildSery да, это настоящий запрос. Сам копировал запрос с этой темы и запустил, результат тотже.
Может индексы замешаны?
Хотя нет - создал другую таблицу без индексов - результат тотже.
Добавлено: 08 авг 2006, 12:31
Ivan_Pisarevsky
KSilver писал(а):Код: Выделить всё
select r1.id, r1.id_reorg, r1.numreg from reorg r1 where r1.numreg = '137011294'
выдаст только 2 записи
353, 6446
Ivan_Pisarevsky невнимательно просмотрели код
Ладно, уговорил
был невнимателен, просто всякие подзапросы с дистинктами наводят на мысли нехорошие о компетентности вопрошающего...
Что мешает подойти к вопросу традиционно, через джойны?
Код: Выделить всё
select
r1.id,
r1.id_reorg,
r1.numreg
from reorg1 r1 join reorg1 r2 on r1.id_reorg = r2.id_reorg
and r2.numreg = '137011294'
Добавлено: 08 авг 2006, 12:37
KSilver
так select то работает нормально.
с delete вот проблемы, не удалянт все что нужно, а только часть.
Ivan_Pisarevsky читаем еще раз внимательно первый пост
Добавлено: 08 авг 2006, 12:59
Dimitry Sibiryakov
А и не будет оно нормально работать. Надо умертвлять (буферизовать) внутренний запрос. Я не помню: у нас ORDER BY в подзапросах позволяется? Вроде бы да, специально для FIRST-SKIP. Во-общем, надо добиться чтобы в в его плане был SORT, тогда отработает нормально.
PS: Oops, сейчас заметил Fb1. Плохо. Придется обертывать в процедуру.
Добавлено: 08 авг 2006, 12:59
Ivan_Pisarevsky
KSilver писал(а):так select то работает нормально.
с delete вот проблемы, не удалянт все что нужно, а только часть.
Ivan_Pisarevsky читаем еще раз внимательно первый пост
ОК, перечитал, как не нравился мне твой селект, так и не нравится. Запустил ибэксперт, забил твои данные, твои запросы, отрабатывает так как тебе хочется, т.е. глюк не воспроизводится, 6 записей отбирается, 6 записей удаляется. Проверил и запрос с джойнами, то же самое 6х6.
Хотя что-то подсознательно мне во всем этом не нравится...
ЗЫ фб 1.5.2
Добавлено: 08 авг 2006, 13:05
Dimitry Sibiryakov
Ivan_Pisarevsky писал(а):Запустил ибэксперт, забил твои данные, твои запросы, отрабатывает так как тебе хочется, т.е. глюк не воспроизводится, 6 записей отбирается, 6 записей удаляется.
У тебя нет индекса на id_reorg, а Серебрянному не повезло.
Добавлено: 08 авг 2006, 13:13
KSilver
Dimitry Sibiryakov писал(а):
У тебя нет индекса на id_reorg, а Серебрянному не повезло.
у меня и без индекса то же самое - пробовал сегодня.
Plan
PLAN SORT ((R1 NATURAL))
PLAN (REORG1 NATURAL)
Adapted Plan
PLAN SORT ((R1 NATURAL)) PLAN (REORG1 NATURAL)
4 record(s) was(were) deleted from REORG1
ORDER BY - в подзапросе не хочет работать
каким способом можго добится SORT ?
Добавлено: 08 авг 2006, 13:14
WildSery
2 KSilver:
Напиши DDL таблицы-то. А то непонятно что сравниваем. Я вот сперва все поля Integer объявил, пока не увидел, что numreg у тебя строковое...
И, кстати, из чего выполнение запроса тестируешь? IBExpert?
Добавлено: 08 авг 2006, 13:24
Ivan_Pisarevsky
Да, индексов нету.
А может ну его нафиг этот дистинг с позапросами?
1.
Код: Выделить всё
select id, id_reorg, numreg
from reorg1 r1 join reorg1 r2 on r1.id_reorg = r2.id_reorg and r2.numreg = '137011294'
2.
Код: Выделить всё
delete from reorg1 r3
where id in(select r1.id
from reorg1 r1 join reorg1 r2 on r1.id_reorg = r2.id_reorg and r2.numreg = '137011294')
Добавлено: 08 авг 2006, 13:28
KSilver
Код: Выделить всё
CREATE TABLE REORG1 (
ID INTEGER NOT NULL,
ID_REORG INTEGER,
NUMREG CHAR(9) CHARACTER SET NONE
);
Тестирую из IBExpert, проверил сейчас на IBConsole - то же самое.
[Модератор: юзай тег Code]
Добавлено: 08 авг 2006, 13:38
Dimitry Sibiryakov
Ну да, я был неправ. Запрос стоило бы умертвлять если бы он не выполнялся на каждую запись во внешней таблице. А так - увы, только обертывание в процедуру спасет отца русской демократии.
Добавлено: 08 авг 2006, 13:39
KSilver
Ivan_Pisarevsky
Код: Выделить всё
select r1.id
from reorg1 r1 join reorg1 r2 on r1.id_reorg = r2.id_reorg and r2.numreg = '137011294'
возвращает все 6 ID
но
Код: Выделить всё
delete from reorg1 r3
where id in(select r1.id
from reorg1 r1 join reorg1 r2 on r1.id_reorg = r2.id_reorg and r2.numreg = '137011294')
удаляет все только те же 4 записи.
Andrew Sagulin - что-то вроде проясняется, но неужели так и есть ?
Добавлено: 08 авг 2006, 13:42
Ivan_Pisarevsky
Плюнь на запрос, пиши ХП.
Не зря не люблю селект с делетом по одной таблице... нутром чую глюки будут, потому так не делал никогда.
Добавлено: 08 авг 2006, 13:42
KSilver
уважаемый модератор вы наверное случайно удалили оч ценный пост
Andrew Sagulin
Добавлено: 08 авг 2006, 13:43
Andrew Sagulin
Dimitry Sibiryakov писал(а):А и не будет оно нормально работать.
Поправьте, Дмитрий, если я не прав.
Подзапрос выполняется для каждой удаляемой записи. В результате, строка "353 1000010680 137011294" может быть удалена раньше, чем другие строки с ID_REORG=1000010680, т.е. результат зависит от физического порядка записей в таблице. Поэтому нужно однократное выполнение подзапроса с его материализацией, а FB этого не умеет (?).
Прошу прощения: сначала отправил сообщение, потом подумал, что бред - удалил. Потом всё-таки решил, что не бред и восстановил.
Добавлено: 08 авг 2006, 13:45
KSilver
Ivan_Pisarevsky придется поколдовать с ХП
Всем BIG THANKS за участие.