powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос: проблема со START WITH
13 сообщений из 13, страница 1 из 1
Иерархический запрос: проблема со START WITH
    #39615673
Alexx_Pol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Имеется удаление из таблицы table1 на основании иерархического запроса к этой же таблице:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
delete from table1
 where pk_col1 in (select pk_col1
                     from table1
                    start with pk_col1 in 
                          (select pk_col1 from pk_bpi_tab
                          where ...)
                   connect by prior pk_col1 = parent_col1);


подзапрос (select pk_col1 from pk_bpi_tab where ...) возвращает Nк строк, но почему-то все строки удаляются только за 3 итерации.

Как происходило:
При первом запуске иерархический запрос почему-то "увидел" только 4 строки (не тысячи) - их и у далил.
При втором запуске удаления подзапрос вернул (8к-4) строк, иерархический запрос "увидел" 7к - их и удалил.
При третьем запуске подзапрос вернул (8к-4-7к) строк, иерархический запрос на этот раз "увидел" все строки - их и удалил.
ВАЖНО: в данном конкретном случае все 8к строк лежат на ОДНОМ уровне - я проверил, но теоретически может быть и иерархия, поэтому убирать его нельзя. В блоке участвует только ОДНА таблица, параллельно с ней никто не мог работать.

Решил я эту проблему через создание вспомагательной таблицы на основании подзапроса - после этого иерархический запрос сразу "увидел" все 8к строк и они были удалены за одну итерацию:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create table sup_table as (select pk_col1 from pk_bpi_tab where ...);

delete from table1
 where pk_col1 in (select pk_col1
                     from table1
                    start with pk_col1 in 
                          (select pk_col1 from sup_table)
                   connect by prior pk_col1 = parent_col1);



У кого-то есть идеи, как можно объяснить такое поведение?
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615777
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexx_Pol,

Удивительно скорее, что он тебе не удалил просто все строки. Простой вопрос - в первом же подзапросе из какой таблицы берётся поле pk_col1?

Код: plsql
1.
2.
select *
from dual where dummy in (select dummy from (select d.dummy no_dummy from dual d) )
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615779
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexx_Pol,

я б для начала в операторе для таблиц и полей добавил разные "алиасы"

.....
stax
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615780
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

у него две таблицы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
delete from table1
 where pk_col1 in (select pk_col1
                     from table1
                    start with pk_col1 in 
                          (select pk_col1 from pk_bpi_tab
                          where ...)
                   connect by prior pk_col1 = parent_col1);



.....
stax
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615841
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Хоть десять. Без алиасов результат будет удивлять в зависимости от фазы Луны и положения Тельца в Козероге.
Особенно, если хотя бы в одной НЕТ поля pk_col1.
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615842
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexx_Pol,

Планы запросов для обоих случаев окажите.
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615843
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envокажите.
*покажите
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615858
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envStax,

Хоть десять. Без алиасов результат будет удивлять в зависимости от фазы Луны и положения Тельца в Козероге.
Особенно, если хотя бы в одной НЕТ поля pk_col1.

Судя по create table sup_table as (select pk_col1 from pk_bpi_tab where ...); поле есть в таблице

зы
у меня в реальной жизни был такой случай (очепятался), но быстро нашел

....
stax
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615898
Alexx_Pol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения за опечатку - таблица одна. Она себя анализирует и удаляет из себя же.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
delete from table1
 where pk_col1 in (select pk_col1
                     from table1
                    start with pk_col1 in 
                          (select pk_col1 from [color=red]table1[/color]
                          where ...)
                   connect by prior pk_col1 = parent_col1);
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615901
Alexx_Pol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соответственно в переделанном коде я тоже опечатался:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create table sup_table as (select pk_col1 from table1where ...);

delete from table1
 where pk_col1 in (select pk_col1
                     from table1
                    start with pk_col1 in 
                          (select pk_col1 from sup_table)
                   connect by prior pk_col1 = parent_col1);
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615906
Alexx_Pol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Проверил оригинальный код - алиасов действительно нет.
Нахожусь в другой таймзоне - завтра попробую их добавить и проверю.
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615908
Alexx_Pol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Планы очень объемные, т.к. позапрос довольно сложный.
...
Рейтинг: 0 / 0
Иерархический запрос: проблема со START WITH
    #39615911
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexx_Pol,

точно надо ін
Код: plsql
1.
2.
3.
4.
5.
....
 start with pk_col1 in 
                          (select pk_col1 from [color=red]table1[/color]
                          where ...)
...



и не
Код: plsql
1.
 start with "условие из where  ..."


?

ps
всеравно я б алиасы вбил явно
.....
stax
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос: проблема со START WITH
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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