代码之家  ›  专栏  ›  技术社区  ›  belgariontheking

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

  •  1
  • belgariontheking  · 技术社区  · 15 年前

    他们的 子零件(第2级零件上的第3级零件)并将其滚动到第2级总成。

    在写这篇文章时,我意识到我可以过滤掉空的级别1部分,并将其与一个查询合并,该查询对空的级别1部分进行聚合,但我想确保没有更好的解决方案。我想我觉得有一个小鸽子洞的查询,我原来给了整个树(较低层次的部分连接到更高层次的部分使用开始和连接),我试图压缩它通过巧妙的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
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Krzysztof    10 年前

    试试这个:

    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;
    

    它做这个工作,但是它返回更多的结果,所以您必须进行过滤。