Мне нужно создать 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 (хотя его идентификатор выбран правильно). Результат выглядит так:
Кто-нибудь знает, почему я получаю такой результат? Почему ID родителей отображается правильно, а правило выбирается только для первого ребенка? Могу ли я неправильно понять оператор WITH? Я почти уверен, что в моем SQL нет опечаток, я просмотрел его уже 100 раз.
Пожалуйста, предоставьте минимальный воспроизводимый пример, обязательно включите необходимый DDL, образцы данных, ожидаемые результаты и фактические результаты.
Также предоставьте полную версию Firebird 2.1, которую вы используете. А вы пробовали вместо этого использовать Firebird 2.5 или Firebird 3.0? Срок службы Firebird 2.1 закончился почти 4 года.
«Мне нужно найти всех родителей и их правила», но с подобным запросом вы жестко запрограммируете максимальное вложение всего на три. Типичным решением этой проблемы было бы С / РЕКУРСИВНОЕ развертывание как можно большего количества родительских строк.
Извините всех за глупый вопрос! Ответ прост: я не заметил небольшой разницы между идентификаторами группы в моем (реальном) результате ...
Я бы сказал, что это ошибка. Мне этот запрос подходит.