Мне нужно создать 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](https://i.stack.imgur.com/rjkos.png)
Кто-нибудь знает, почему я получаю этот результат?
Почему идентификатор родителей отображается правильно, а правило выбрано только для первого ребенка? Есть ли у меня какое-то принципиальное недопонимание оператора WITH? Я почти уверен, что в моем SQL нет опечаток, я уже просмотрел его 100 раз.