Проблемы с CONNECT BY и start with id IN (

DeAmon2K
Дата: 05.12.2007 08:35:42
Народ подскажите.
Есть большая иерархическая таблица. Мне нужно собрать не все её ветки, а только те которые мне нужны. Т.е. есть куча листьев (предприятия) и мне нужны их пути на верх. Список предприятий я собираю select-ом. И если этот селект вставлять в start with id in (select ... from ...), то он выполняется очень долго (так как для каждой строчки он исполняется каждый раз). Если использовать with (select ... from ...), то всё получается класно, НО!!! Дело в том что я это вставляю, как источник в другую программу - SSAS 2005. Там 2 провайдера .Net Oracle и OleDB. Первый конструкцию понимает, но выполнить не может. Второй не понимает with - ставит его в скобки и соотвественно баранку получаю. Попробовал в Oracle создать view-ху c with (и её в качестве источника использовать), но Оракл написал (при исполнении) - неподдерживаемая фича.
Пошукав здесь, я нашел как можно из строки с запятыми парсить и получить "как бы" таблицу и подставлять её в IN (. Но как мне тогда эту строчку получить из запроса?
Бабичев Сергей
Дата: 05.12.2007 09:27:29
НУ, во-первых, если клиент не понимает WITH, то его обманывают вот так:
SELECT *
  FROM (
           WITH t as ()...
           select * from t
         )

Во-вторых, нужно помнить, что IN всегда можно заменить на EXISTS или даже на JOIN.
В-третьих, без текста запроса и без его плана - это вообще разговор ни о чём...
DeAmon2K
Дата: 05.12.2007 10:58:49
Запрос такой
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 достаточно большой...
Jannny
Дата: 05.12.2007 11:01:42
DeAmon2K
Соотвественно клиенты упомянутые выше (SQL Navigator нормально исполняет) не могут его исполнить. А если сделать это без with
Вам разве не ответили на это?
DeAmon2K
Дата: 05.12.2007 11:12:17
если запихивается 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
То это аналогично второму варианту, т.е. исполняется очень долго... не приемлемо
Jannny
Дата: 05.12.2007 11:15:01
DeAmon2K
если запихивается with внутрь, как подсказали т.е.
это совсем не то, что подсказали! Обертываете не start with, а все.

DeAmon2K
То это аналогично второму варианту, т.е. исполняется очень долго... не приемлемо
Бабичев Сергей
В-третьих, без текста запроса и без его плана - это вообще разговор ни о чём...
DeAmon2K
Дата: 05.12.2007 11:49:01
К сожалению способ предложенный оборачивания снаружи не проходит... OLEDB for Oracle провайдер, заботливо оборачивает все непонятные слова в кавычки и ничего не получается. .Net provider пропускает, как и первую, но всё уходит в какие то "долгие дали" и ответа не видно совсем... Возможен ли вариант без with?
DeAmon2K
Дата: 05.12.2007 12:08:55
Какие то ноги тянутся еще от .Net provider.
После некоторого упрощения запроса с with SQL Navigator исполняет его за 2-3 секунды. Через .NET провайдер сессия, стоит и чего то собирает (посмотрели в QUEST Spotlight). Такое впечатление что различие в SESSION переменных... Ни кто не подскажет в какую сторону хотя бы смотреть?