2016-03-10 3 views
1

В данном Сценарии у нас есть несколько партий ингредиентов, которые мы смешиваем с партиями побочных продуктов. Эти партии промежуточных продуктов используются для дальнейших промежуточных продуктов или для партий готовой продукции. Между ингредиентами и готовым продуктом существует несколько промежуточных этапов.Oracle Иерархический запрос «начать с» -значения в том месте, где статья

Чтобы найти все серии, которые используются в данной готовой партии продукции Я хотел бы написать Oracle SQL, как:

SELECT 
    something 
FROM (
    SELECT 
     something_else 
    FROM DB_TABLE 
    START WITH DB_TABLE.OUTPUT = START_VALUE 
    CONNECT BY NOCYCLE PRIOR DB_TABLE.OUTPUT = DB_TABLE.INPUT 
    ) QRY_NAME 
WHERE START_VALUE = '1400929801' 

Я знаю, что этот пример выше не работает, но это показывает, что я ищу.
Итак, мне нужно определить начало со значением в предложении where внешнего запроса, но не знаю, как это сделать.
Запрос будет включен в программное обеспечение, где пользователи могут определять предложение where.

+1

Зачем вам нужен вложенный запрос? – Aleksej

+0

Возможно, вам следует объяснить * почему * вам нужно определить начальное значение во внешнем запросе. Похоже на проблему [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378). –

+0

В внешнем запросе есть несколько соединений. Мне не нужна она вложенная, но для уменьшения мощности. – Cabation

ответ

0

Предполагая, что вы должны иметь начальное значение во внешнем запросе по какой-то причине, вы можете попробовать следующее:

SELECT 
    something 
FROM (
    SELECT 
     something_else, connect_by_root(DB_TABLE.INPUT) as root 
    FROM DB_TABLE 
    CONNECT BY NOCYCLE PRIOR DB_TABLE.INPUT = DB_TABLE.OUTPUT 
    ) QRY_NAME 
WHERE root = '1400929801' 

Он просто выполняет запрос, добавление столбца, чтобы сохранить значение корня, так что вы можете использовать его как фильтр во внешнем запросе.

Однако, если вам просто нужен внешний запрос для ограничения количества результатов, вы можете получить начальное значение во внутреннем запросе, а затем использовать внешний, чтобы ограничить набор результатов только некоторыми критериями; например:

SELECT 
     something 
    FROM (
     SELECT 
      something_else 
     FROM DB_TABLE 
     START WITH DB_TABLE.INPUT = '1400929801' 
     CONNECT BY NOCYCLE PRIOR DB_TABLE.INPUT = DB_TABLE.OUTPUT 
     ) QRY_NAME 
    WHERE /* some condition */ 

В зависимости от ваших потребностей, может быть, вы даже можете поместить свои предельные критерии во внутреннем запросе, без внешней один, но это зависит от как вы хотите ограничить набор результатов

+0

Первый из ваших кодов подходит для того, что мне нужно. Но внутренний запрос - это миллионы записей, которые я фильтровал в начале с предложением.Так что с вашим первым кодом я теряю фильтр и большую производительность.Конечные предложения по этому поводу? – Cabation

+0

С вашим вторым кодом есть все тот же вызов: как получить значение «начать с» до того места, где clause? – Cabation

+0

Если у вас есть предложение «СТАРТ С», ваши результаты будут правильно ограничены, без каких-либо проблем с производительностью, так что вопрос остается следующим: зачем вам использовать внешний запрос для ограничения набора результатов? – Aleksej

Смежные вопросы