我需要为 Firebird 2.1 构建 SQL 查询。我正在尝试使用WITH语句进行选择,该语句需要在此查询中执行多次(我以前从未使用过此构造)。
情况(非常简单)如下:我有一个表,比方说 ITEM_GROUP,它存储项目组。组可以是彼此的子组。所以还有一个表CHILD_PARENT_GROUP,它存储信息,哪个组是哪个组的子组。最后,每个组都可以有一些与之相关的规则,因此有一个表 GROUP_RULE,它存储信息,对于哪个组我有哪些规则。 现在,根据给定的组 ID,我需要找到所有家长及其规则(如果他们有规则)。
我使用的(简化的)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 的子级,而 SOME_CHILD_1 是 THE_PARENT_GROUP 的子级。假设只有 ID 为 THE_PARENT_GROUP 的组有相关规则(例如名称为 PARENT_RULE),所有其他组都没有规则。现在,我从这个查询中得到的结果很奇怪: 当选择THE_PARENT_GROUP作为第一组时,其规则被正确选择,但是如果选择THE_PARENT_GROUP作为第二或第三组,则选择null作为其规则(尽管其id被正确选择)。所以结果看起来像这样:
有人知道为什么我会得到这个结果吗? 为什么父母的ID显示正确,但规则只选择第一个孩子?我对WITH语句有一些基本的误解吗?我很确定,我的 SQL 中没有拼写错误,我已经检查了 100 遍了。
抱歉问了这个愚蠢的问题!答案很简单,我没有注意到我的(真实)结果中的组 ID 之间存在细微差别......