SQL -Oracle 21 c中递归部分的不同结果

e3bfsja2  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(84)

非常感谢您提供的所有解决方案,因为当时间允许时,我会去现场并尝试自己解决它,所以以这种方式我也学习。
我使用SQL Server 2022和Oracle 21 c。
每次我发现一个有趣的问题,如果提供的解决方案只适用于SQL Server,我都会尝试将其适应Oracle,反之亦然。
现在我需要你的帮助,请,解决一个问题,但特别是理解,因为不幸的是,在这种情况下,我不明白我还应该做什么,在甲骨文有同样的解决方案。
我离开了几天前发布的以下问题SQL Server - Checking for integer (id) within hierarchy of ids,解决方案在Sql Server中。
不幸的是,在我适应了Oracle之后,在某些地方我没有得到同样的结果。
如果不对脚本进行任何更改,并按location_id对asc进行排序,那么直到location_id 6(包括location_id=6),一切都是正确的,然后一切都是错误的。
在递归部分中,我修改并将partition by tree1.location_order放在那个row_number中,除了location_id=10我一直试图改变之外,结果还可以,但是为了解决location_id =10,我在递归部分中通过tree1.location_id desc排序。location_id = 10可以解决这个问题,但location_id = 6时出现了错误,一切都变得混乱了。我相信解决方案在于row_number的递归排序。
我无法以某种方式将信息联系起来,逻辑上理解背后发生的事情(我没有太多经验),并将从row_number --order by b.location_order,tree1.location_id的排序可视化
我还补充说,RNPROB认为,也许我会更好地理解。
我为SQL Server 2022 https://dbfiddle.uk/r-QXHGJJ创建了具有所需输出的db fiddle,并为Oracle https://dbfiddle.uk/tRhdk0X3创建了db fiddle(不幸的是,这里的db fiddle插入部分给出了一个错误,但在Oracle中它工作正常)
谢谢你的好意
期望的输出。在小提琴是适当地命令期望的输出。我很抱歉它看起来像下面。

location_id parent_id   level   location_order  location_name   location_name_hierarchy row_number_hierarchy    location_id_hierarchy
1   NULL    0   1   Location 1  Location 1  1   1
2   1   1   2   Location 2  Location 1/Location 2   1/2 1/2
3   1   1   1   Location 3  Location 1/Location 3   1/1 1/3
4   1   1   3   Location 4  Location 1/Location 4   1/3 1/4
5   2   2   1   Location 5  Location 1/Location 2/Location 5    1/2/1   1/2/5
6   5   3   1   Location 6  Location 1/Location 2/Location 5/Location 6 1/2/1/1 1/2/5/6
7   2   2   2   Location 7  Location 1/Location 2/Location 7    1/2/2   1/2/7
8   7   3   1   Location 8  Location 1/Location 2/Location 7/Location 8 1/2/2/1 1/2/7/8
9   3   2   1   Location 9  Location 1/Location 3/Location 9    1/1/1   1/3/9
10  9   3   1   Location 10 Location 1/Location 3/Location 9/Location 10    1/1/1/1 1/3/9/10
11  4   2   2   Location 11 Location 1/Location 4/Location 11   1/3/2   1/4/11
12  4   2   1   Location 12 Location 1/Location 4/Location 12   1/3/1   1/4/12

字符串

pkbketx9

pkbketx91#

用途:

row_number() over (partition by b.parent_id order by  b.location_order, b.location_id)

字符串
这将使您的查询:

with tree1 (
  location_id,
  parent_id,
  nivel,
  location_order,
  location_name,
  location_name_hierarchy,
  row_number_hierarchy, 
  RNPROB,
  location_id_hierarchy
) AS (
  SELECT location_id,
         parent_id,
         0 AS nivel,
         location_order,
         location_name,
         cast(location_name as nvarchar2(200)),
         cast(
           row_number() over (
             partition by location_order
             order by location_order, location_id
           )
           as nvarchar2(200)
         ),
         row_number() over (
           partition by location_order
           order by location_order, location_id
         ),
         cast(location_id as nvarchar2(200))
  FROM   location_tbl
  WHERE  parent_id IS NULL 
UNION ALL
  SELECT B.location_id,
         B.parent_id,
         tree1.nivel + 1,
         B.location_order,
         B.location_name,
         location_name_hierarchy || '/' || cast(B.location_name as nvarchar2(200)), 
         row_number_hierarchy || '/' || row_number() over (
           partition by b.parent_id
           order by  b.location_order, b.location_id
         ),
         row_number() over (
           partition by b.parent_id
           order by b.location_order, b.location_id
         ),
         location_id_hierarchy || '/' || cast(B.location_id as nvarchar2(200))
  FROM   location_tbl  B 
         INNER JOIN tree1
         ON tree1.location_id = B.parent_id
)
SELECT location_id,
       parent_id,
       NIVEL,
       location_order,
       location_name,
       location_name_hierarchy,
       row_number_hierarchy,
       RNPROB,
       location_id_hierarchy
FROM   tree1
order by location_id;


哪些输出:
| 父ID|尼维尔|位置_订单|位置_名称|位置_名称_层级|行号层次结构|RNPROB|位置_ID_层级| LOCATION_ID_HIERARCHY |
| --|--|--|--|--|--|--|--| ------------ |
| * 空 *| 0个|一个|地点1|地点1|一个|一个|一个| 1 |
| 一个|一个|二个|地点2|位置1/位置2| 1/2|二个|1/2| 1/2 |
| 一个|一个|一个|地点3|位置1/位置3| 1/1|一个|1/3| 1/3 |
| 一个|一个|三个|地点4|位置1/位置4| 1/3|三个|四分之一| 1/4 |
| 二个|二个|一个|地点5|位置1/位置2/位置5| 1/2/1|一个|1/2/5| 1/2/5 |
| 五个|三个|一个|地点6|位置1/位置2/位置5/位置6| 1/2/1/1|一个|1/2/5/6| 1/2/5/6 |
| 二个|二个|二个|地点7|位置1/位置2/位置7| 1/2/2|二个|1/2/7| 1/2/7 |
| 七个|三个|一个|地点8|位置1/位置2/位置7/位置8| 1 2 2 1|一个|1/2/7/8| 1/2/7/8 |
| 三个|二个|一个|地点9|位置1/位置3/位置9| 1/1/1|一个|1/3/9| 1/3/9 |
| 九个|三个|一个|地点10|位置1/位置3/位置9/位置10| 1/1/1/1|一个|10年1月3日9日| 1/3/9/10 |
| 四个|二个|二个|地点11|位置1/位置4/位置11| 1/3/2|二个|十一年四月一日| 1/4/11 |
| 四个|二个|一个|地点12|位置1/位置4/位置12| 1/3/1|一个|2012年1月4日| 1/4/12 |
fiddle

相关问题