当前位置: 首页 > 面试题库 >

Oracle分层总和(从叶到根的距离)

薛楷
2023-03-14
问题内容

我想获得有关分层查询(Oracle 11gR2)的帮助。这些查询让我很难受…

实际上,这是2合1问题(需要2种不同的方法)。

我正在寻找一种方法来获取所有个人记录到词根的距离(而不是相反的)。我的数据在树状结构中:

CREATE TABLE MY_TREE
(ID_NAME VARCHAR2(1) PRIMARY KEY,
 PARENT_ID VARCHAR2(1),
 PARENT_DISTANCE NUMBER(2)
);

INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('A',NULL,NULL);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('B','A',1);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('C','B',3);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('D','B',5);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('E','C',7);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('F','D',11);
INSERT INTO MY_TREE (ID_NAME,PARENT_ID,PARENT_DISTANCE) VALUES('G','D',13);

从层次上讲,我的数据看起来像这样(但是我有多个独立的根,还有更多的层次):

在此处输入图片说明

在第一个方法中,我正在寻找一个查询,该查询将给我以下结果:

LEVEL ROOT NODE ID_NAME ROOT_DISTANCE
----- ---- ---- ------- -------------
1     A    null A       null
2     A    null B       1
3     A    B    C       4
4     A    B    E       11
3     A    B    D       6
4     A    D    F       17
4     A    D    G       19

在这个结果中,

  • “ NODE”列表示最接近的拆分元素的ID_NAME
  • “ ROOT_DISTANCE”列表示从元素到根的距离(例如:ID_NAME = G的ROOT_DISTANCE是从G到A的距离:G(13)+ D(5)+ B(1)= 19)

在此方法中,我将始终指定最多2个根。

第二个方法必须是PL /
SQL脚本,该脚本将执行相同的计算(ROOT_DISTANCE),但以迭代方式进行,并将结果写入新表中。我想一次运行此脚本,因此将处理所有根(〜1000)。

这是我看脚本的方式:

  • 对于所有根,我们需要找到关联的叶子,然后计算从叶子到根的距离(对于叶子和根之间的所有元素),并将其放入表格中。

“性能角度”需要此脚本,因此,如果已经计算出一个元素(例如:由另一片叶子计算出的拆分节点),则需要停止计算并传递到下一个叶子,因为我们已经知道结果了从那里到根。例如,如果系统先计算ECBA,再计算FDBA,则不应再次计算BA部分,因为它是在第一遍中完成的。

您可以对这两个问题中的一个或两个进行问题,但我需要针对这两个问题的问题。

谢谢!


问题答案:

试试这个:

WITH brumba(le_vel,root,node,id_name,root_distance) AS (
  SELECT 1 as le_vel, id_name as root, null as node, id_name, to_number(null) as root_distance  
  FROM MY_TREE WHERE parent_id IS NULL
  UNION ALL
  SELECT b.le_vel + 1, b.root, 
         CASE WHEN 1 < (
                SELECT count(*) FROM MY_TREE t1 WHERE t1.parent_id = t.parent_id
              )
              THEN t.parent_id ELSE b.node
         END,
         t.id_name, coalesce(b.root_distance,0)+t.parent_distance
  FROM MY_TREE t
  JOIN brumba b ON b.id_name = t.parent_id
)
SELECT * FROM brumba

无需使用PL / SQL进行“第二种方法”-上面的SQL将立即计算所有根节点(parent_id列中为空)的结果。
只需添加一个前缀或者INSERT INTO tablename(col1,col2, ... colN) ...还是CREATE TABLE name AS ...以上面的查询。
上面的演示包含后一个选项的示例CREATE TABLE xxx AS query



 类似资料:
  • 代码假设返回树中从根到叶的每条路径的列表,顺序从左到右。具有一个子节点(一个子节点(一个子节点)和一个子节点(一个子节点)不被视为叶节点。 我试着像这样编码 但返回的路径似乎包括具有一个子节点的节点。这将导致类似于

  • 我已经解决了很多与树相关的问题,但是,我仍然对树的一个特定方面(通常是递归)没有信心: 如何将值从叶传播到根? 例如,假设我们有一个二叉树,其中我们必须找到具有最小和的根到叶路径。对于此处的树图像,总和将为7(对应于两条路径0-3-2-1-1或0-6-1)。 我编写了以下代码: 我知道最后一次返回的货币不正确,但是我应该返回什么?从技术上讲,我只想在到达叶节点时返回minVal的值(在中间节点时没

  • 问题是:计算所有根到叶数的总和。例如:如果树是(1,2,3),1是根,2是左子,3是右子,两条路径:1- 这是我正确的递归解决方案。在助手方法中,返回总和: 但是当我在helper方法中添加作为参数时,我总是得到0。 我相信我对递归一定有一些误解。提前感谢您给我一些解释,为什么的值没有“转移”回方法中的。

  • 问题内容: 我在Oracle11g中有一个具有(id,parent_id)结构的表。 我想对其进行查询,以获取与这些ID各自分层链接的所有行,因此结果应为: 我一直在和上苦苦挣扎,现在,我所能得到的只是查询所需结果的一小部分: 我不想使用任何循环来获取完整的结果。 任何的想法 ? 最好的问候,J茅r么我Lefr猫re PS:在第一个答案之后编辑,注意到我忘记了一些我想要的结果… 问题答案: 您发布

  • 本文向大家介绍C ++中树的距离总和,包括了C ++中树的距离总和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一棵无向的,连接的树,其中有N个节点。这些标记为0 ... N-1,给出了N-1边。第i条边将节点edge [i] [0]和edge [i] [1]连接在一起。我们必须找到一个列表,其中ans [i]是节点i与所有其他节点之间的距离之和。 因此,如果输入像N = 6并且edges

  • 我有一条在2D中有80个点的分段线和一个不在这条线上的点P(X/Y)。 我需要知道点P'在这条线上的什么位置,它与点P的距离最短。 有没有一个简单的计算方法? 编辑: 输入文件: 输出文件: 分段线上的点