Firebird sql с использованием оператора "with": выбор кажется неправильным при многократном использовании оператора with.

Мне нужно создать SQL-запрос для Firebird 2.1. и я пытаюсь использовать оператор WITH для выбора, который должен выполняться несколько раз в этом запросе (я никогда раньше не использовал эту конструкцию).

Ситуация (очень упрощенная) следующая: у меня есть таблица, скажем ITEM_GROUP, в которой хранятся группы элементов. Группы могут быть подгруппами друг друга. Итак, есть еще одна таблица CHILD_PARENT_GROUP, в которой хранится информация, дочерней группой которой является группа. И, наконец, каждая группа может иметь какое-то правило, связанное с ней, поэтому есть таблица GROUP_RULE, в которой хранится информация, для какой группы у меня есть какие правила. Теперь, основываясь на заданном идентификаторе группы, мне нужно найти всех родителей и их правила (если у них есть правила).

(Упрощенный) SQL, который я использую, выглядит следующим образом:

             WITH
                GROUP_RULE AS(
                select gr.ID AS GROUP_ID, rule.RULE_NAME AS RULE_NAME, childParent.PARENT_GROUP_ID AS PARENT_ID
                from ITEM_GROUP gr
                left join GROUP_RULE rule on gr.ID = rule.GROUP_ID
                left join CHILD_PARENT_GROUP childParent on childParent.CHILD_GROUP_ID = gr.ID
             )
             SELECT
                 G1.GROUP_ID AS G1_ID, G1.RULE_NAME AS G1_RULE,
                 G2.GROUP_ID AS G2_ID, G2.RULE_NAME AS G2_RULE,
                 G3.GROUP_ID AS G3_ID, G3.RULE_NAME AS G3_RULE,

             FROM GROUP_RULE G1
             left join GROUP_RULE G2 on G1.PARENT_ID = G2.GR_ID
             left join GROUP_RULE G3 on G2.PARENT_ID = G3.GR_ID

             where G1.GR_ID in ('THE_PARENT_GROUP', 'SOME_CHILD_1', 'SOME_CHILD_2')

Скажем, SOME_CHILD_2 является потомком SOME_CHILD_1, который является потомком THE_PARENT_GROUP. Допустим, только группа с идентификатором THE_PARENT_GROUP имеет связанное правило (имя которого, например, PARENT_RULE), все остальные группы не имеют правил. Результат, который я получаю от этого запроса, довольно странный: Когда THE_PARENT_GROUP выбрана в качестве первой группы, ее правило выбрано правильно, но если THE_PARENT_GROUP выбрано в качестве второй или третьей группы, в качестве правила выбирается значение null (хотя его идентификатор выбран правильно). Результат выглядит так:

enter image description here

Кто-нибудь знает, почему я получаю такой результат? Почему ID родителей отображается правильно, а правило выбирается только для первого ребенка? Могу ли я неправильно понять оператор WITH? Я почти уверен, что в моем SQL нет опечаток, я просмотрел его уже 100 раз.

Я бы сказал, что это ошибка. Мне этот запрос подходит.

Thorsten Kettner 10.09.2018 09:48

Пожалуйста, предоставьте минимальный воспроизводимый пример, обязательно включите необходимый DDL, образцы данных, ожидаемые результаты и фактические результаты.

Mark Rotteveel 10.09.2018 09:57

Также предоставьте полную версию Firebird 2.1, которую вы используете. А вы пробовали вместо этого использовать Firebird 2.5 или Firebird 3.0? Срок службы Firebird 2.1 закончился почти 4 года.

Mark Rotteveel 10.09.2018 10:07

«Мне нужно найти всех родителей и их правила», но с подобным запросом вы жестко запрограммируете максимальное вложение всего на три. Типичным решением этой проблемы было бы С / РЕКУРСИВНОЕ развертывание как можно большего количества родительских строк.

Arioch 'The 10.09.2018 11:26
1
4
3 358
1

Ответы 1

Извините всех за глупый вопрос! Ответ прост: я не заметил небольшой разницы между идентификаторами группы в моем (реальном) результате ...

Другие вопросы по теме