Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将我的树“压缩”为Oracle层次结构上的聚合数据?_Sql_Oracle_Union - Fatal编程技术网

Sql 如何将我的树“压缩”为Oracle层次结构上的聚合数据?

Sql 如何将我的树“压缩”为Oracle层次结构上的聚合数据?,sql,oracle,union,Sql,Oracle,Union,我必须得到1级零件子零件的限制列表。某些部分的限制为空,对于那些空部分,我必须查询该部分上的2级部分,并给出这些2级部分限制的最小值。对于一些2级部件,我必须得到它们的子部件的最小值,即2级部件上的3级部件,并将其汇总到2级集合 你的方法是什么 在写这篇文章时,我意识到我可以过滤掉空的级别1部分,并将其与一个对空的级别1部分进行聚合的查询合并,但我想确保没有更好的解决方案。我想我对最初给出的查询感到有点不知所措,它给出了整个树的低层部分,使用START WITH和CONNECT by将低层部分连

我必须得到1级零件子零件的限制列表。某些部分的限制为空,对于那些空部分,我必须查询该部分上的2级部分,并给出这些2级部分限制的最小值。对于一些2级部件,我必须得到它们的子部件的最小值,即2级部件上的3级部件,并将其汇总到2级集合

你的方法是什么

在写这篇文章时,我意识到我可以过滤掉空的级别1部分,并将其与一个对空的级别1部分进行聚合的查询合并,但我想确保没有更好的解决方案。我想我对最初给出的查询感到有点不知所措,它给出了整个树的低层部分,使用START WITH和CONNECT by将低层部分连接到高层部分,我试图通过巧妙的SQL对其进行压缩,但我做不到。此外,我希望查询使用n个级别的聚合,而不是一个基于复制粘贴联合和子查询次数的有限数

这必须在SQL中完成。我不能使用PL/SQL

为了简单起见,可以这样考虑模式:

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;

它可以完成这项工作,但它会返回更多结果,因此您必须进行筛选。

所有级别都存储在同一个表中吗?如果您提供一两个示例,则更容易解释。是否所有级别都存储在同一个表中?如果您提供一两个示例,则更容易解释。