Firebird SQL с использованием оператора WITH: выбор кажется неправильным при использовании выбора WITH несколько раз - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно создать 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

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

1 Ответ

0 голосов
/ 11 сентября 2018

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

...