Как я могу "сжать" мое дерево в совокупные данные по иерархии в Oracle? - PullRequest
1 голос
/ 26 августа 2009

Я должен получить список ограничений для подразделов уровня 1part. Пределы для некоторых частей равны нулю, а для этих пустых частей я должен запросить части уровня 2, которые находятся в этой части, и дать МИНУЗУ пределов этих частей уровня 2. Для некоторых частей 2-го уровня я должен получить МИНУТУ их подчастей (части 3-го уровня в этой части 2-го уровня) и свернуть их до совокупности 2-го уровня.

Каков будет ваш подход?

При написании этого я понял, что могу отфильтровать обнуленные части уровня 1 и объединить его с запросом, который выполняет агрегацию для обнуленных частей уровня 1, но я хочу убедиться, что лучшего решения нет. Я думаю, что я чувствовал себя маленьким голубем, скрытым запросом, который мне дали изначально, который дал все дерево (части деталей более низкого уровня были соединены с деталями более высокого уровня, используя START WITH и CONNECT BY), и я пытался сжать его с помощью умного SQL, но я не мог. Кроме того, я бы хотел, чтобы запрос работал с n уровнями агрегирования, а не с конечным числом, исходя из того, сколько раз я хочу скопировать и вставить свои UNION и подзапросы.

Это должно быть сделано в SQL. Я не могу использовать PL / SQL.

Для простоты, представьте схему следующим образом:

Assembly table
level1_serial | level2_serial
-----------------------------
1234          | null
123           | 1
123           | 2
123           | 3

Limit table
part_serial | limit 
-------------------
1234        | 1000
123         | null
1           | 500
2           | 400
3           | 600

В этом случае мне нужно будет вернуть две записи следующим образом

part_serial | limit
-------------------
1234        | 1000
123         | 400

1 Ответ

1 голос
/ 14 ноября 2011

Попробуйте это:

SELECT
    PART_SERIAL,
    MIN(LIMIT)
FROM (    
    SELECT 
        NVL(PRIOR LIMIT.PART_SERIAL, LIMIT.PART_SERIAL) PART_SERIAL,
        LIMIT.LIMIT LIMIT,
        LEVEL
    FROM 
        LIMIT
    CONNECT BY PRIOR 
        LIMIT IS NULL AND 
        PRIOR PART_SERIAL <> PART_SERIAL AND 
        INSTR(PRIOR PART_SERIAL, PART_SERIAL) > 0 AND LEVEL < 10
)
GROUP BY PART_SERIAL;

Он выполняет свою работу, но возвращает больше результатов, поэтому вы должны выполнить фильтрацию.

...