Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проблемы с CONNECT BY и start with id IN (  [new]
DeAmon2K
Member

Откуда: Норильск
Сообщений: 226
Народ подскажите.
Есть большая иерархическая таблица. Мне нужно собрать не все её ветки, а только те которые мне нужны. Т.е. есть куча листьев (предприятия) и мне нужны их пути на верх. Список предприятий я собираю select-ом. И если этот селект вставлять в start with id in (select ... from ...), то он выполняется очень долго (так как для каждой строчки он исполняется каждый раз). Если использовать with (select ... from ...), то всё получается класно, НО!!! Дело в том что я это вставляю, как источник в другую программу - SSAS 2005. Там 2 провайдера .Net Oracle и OleDB. Первый конструкцию понимает, но выполнить не может. Второй не понимает with - ставит его в скобки и соотвественно баранку получаю. Попробовал в Oracle создать view-ху c with (и её в качестве источника использовать), но Оракл написал (при исполнении) - неподдерживаемая фича.
Пошукав здесь, я нашел как можно из строки с запятыми парсить и получить "как бы" таблицу и подставлять её в IN (. Но как мне тогда эту строчку получить из запроса?
5 дек 07, 08:35    [5003970]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
НУ, во-первых, если клиент не понимает WITH, то его обманывают вот так:
SELECT *
  FROM (
           WITH t as ()...
           select * from t
         )

Во-вторых, нужно помнить, что IN всегда можно заменить на EXISTS или даже на JOIN.
В-третьих, без текста запроса и без его плана - это вообще разговор ни о чём...
5 дек 07, 09:27    [5004112]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
DeAmon2K
Member

Откуда: Норильск
Сообщений: 226
Запрос такой
with s as
(
select id_pred from ...
)

select id from structure_dep connect by prior code_subordinate=id start with id in
(select id_pred from s) group by id
Так вот то что исполняется в with строится порядка 5 секунд и выход 50-60 строчек и все оригинальные родители выдаются на ура очень быстро. Соотвественно клиенты упомянутые выше (SQL Navigator нормально исполняет) не могут его исполнить. А если сделать это без with
select id from structure_dep connect by prior code_subordinate=id start with id in
(select id_pred from ...) group by id
то процесс затягивается на очень и очень долго, т.к. structure_dep достаточно большой...
5 дек 07, 10:58    [5004745]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
DeAmon2K
Соотвественно клиенты упомянутые выше (SQL Navigator нормально исполняет) не могут его исполнить. А если сделать это без with
Вам разве не ответили на это?
5 дек 07, 11:01    [5004770]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
DeAmon2K
Member

Откуда: Норильск
Сообщений: 226
если запихивается with внутрь, как подсказали т.е.
select id from structure_dep connect by prior code_subordinate=id start with id in
(select id_pred from 
(
with s as
(
select id_pred from ...
)
)
) group by id
То это аналогично второму варианту, т.е. исполняется очень долго... не приемлемо
5 дек 07, 11:12    [5004887]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
DeAmon2K
если запихивается with внутрь, как подсказали т.е.
это совсем не то, что подсказали! Обертываете не start with, а все.

DeAmon2K
То это аналогично второму варианту, т.е. исполняется очень долго... не приемлемо
Бабичев Сергей
В-третьих, без текста запроса и без его плана - это вообще разговор ни о чём...
5 дек 07, 11:15    [5004920]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
DeAmon2K
Member

Откуда: Норильск
Сообщений: 226
К сожалению способ предложенный оборачивания снаружи не проходит... OLEDB for Oracle провайдер, заботливо оборачивает все непонятные слова в кавычки и ничего не получается. .Net provider пропускает, как и первую, но всё уходит в какие то "долгие дали" и ответа не видно совсем... Возможен ли вариант без with?
5 дек 07, 11:49    [5005236]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с CONNECT BY и start with id IN (  [new]
DeAmon2K
Member

Откуда: Норильск
Сообщений: 226
Какие то ноги тянутся еще от .Net provider.
После некоторого упрощения запроса с with SQL Navigator исполняет его за 2-3 секунды. Через .NET провайдер сессия, стоит и чего то собирает (посмотрели в QUEST Spotlight). Такое впечатление что различие в SESSION переменных... Ни кто не подскажет в какую сторону хотя бы смотреть?
5 дек 07, 12:08    [5005410]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить