我想获得有关分层查询(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
在这个结果中,
在此方法中,我将始终指定最多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
parent_id
INSERT INTO tablename(col1,col2, ... colN) ...
CREATE TABLE name AS ...
CREATE TABLE xxx AS query