Sql 如何将我的树“压缩”为Oracle层次结构上的聚合数据?
我必须得到1级零件子零件的限制列表。某些部分的限制为空,对于那些空部分,我必须查询该部分上的2级部分,并给出这些2级部分限制的最小值。对于一些2级部件,我必须得到它们的子部件的最小值,即2级部件上的3级部件,并将其汇总到2级集合 你的方法是什么 在写这篇文章时,我意识到我可以过滤掉空的级别1部分,并将其与一个对空的级别1部分进行聚合的查询合并,但我想确保没有更好的解决方案。我想我对最初给出的查询感到有点不知所措,它给出了整个树的低层部分,使用START WITH和CONNECT by将低层部分连接到高层部分,我试图通过巧妙的SQL对其进行压缩,但我做不到。此外,我希望查询使用n个级别的聚合,而不是一个基于复制粘贴联合和子查询次数的有限数 这必须在SQL中完成。我不能使用PL/SQL 为了简单起见,可以这样考虑模式:Sql 如何将我的树“压缩”为Oracle层次结构上的聚合数据?,sql,oracle,union,Sql,Oracle,Union,我必须得到1级零件子零件的限制列表。某些部分的限制为空,对于那些空部分,我必须查询该部分上的2级部分,并给出这些2级部分限制的最小值。对于一些2级部件,我必须得到它们的子部件的最小值,即2级部件上的3级部件,并将其汇总到2级集合 你的方法是什么 在写这篇文章时,我意识到我可以过滤掉空的级别1部分,并将其与一个对空的级别1部分进行聚合的查询合并,但我想确保没有更好的解决方案。我想我对最初给出的查询感到有点不知所措,它给出了整个树的低层部分,使用START WITH和CONNECT by将低层部分连
Assembly table
level1_serial | level2_serial
-----------------------------
1234 | null
123 | 1
123 | 2
123 | 3
Limit table
part_serial | limit
-------------------
1234 | 1000
123 | null
1 | 500
2 | 400
3 | 600
在这种情况下,我需要返回两条记录,如下所示
part_serial | limit
-------------------
1234 | 1000
123 | 400
试试这个:
SELECT
PART_SERIAL,
MIN(LIMIT)
FROM (
SELECT
NVL(PRIOR LIMIT.PART_SERIAL, LIMIT.PART_SERIAL) PART_SERIAL,
LIMIT.LIMIT LIMIT,
LEVEL
FROM
LIMIT
CONNECT BY PRIOR
LIMIT IS NULL AND
PRIOR PART_SERIAL <> PART_SERIAL AND
INSTR(PRIOR PART_SERIAL, PART_SERIAL) > 0 AND LEVEL < 10
)
GROUP BY PART_SERIAL;
它可以完成任务,但会返回更多结果,因此您必须进行筛选。尝试以下操作:
SELECT
PART_SERIAL,
MIN(LIMIT)
FROM (
SELECT
NVL(PRIOR LIMIT.PART_SERIAL, LIMIT.PART_SERIAL) PART_SERIAL,
LIMIT.LIMIT LIMIT,
LEVEL
FROM
LIMIT
CONNECT BY PRIOR
LIMIT IS NULL AND
PRIOR PART_SERIAL <> PART_SERIAL AND
INSTR(PRIOR PART_SERIAL, PART_SERIAL) > 0 AND LEVEL < 10
)
GROUP BY PART_SERIAL;
它可以完成这项工作,但它会返回更多结果,因此您必须进行筛选。所有级别都存储在同一个表中吗?如果您提供一两个示例,则更容易解释。是否所有级别都存储在同一个表中?如果您提供一两个示例,则更容易解释。