Sql 非标准化等级数据的更新
我有一个包含三列的表:父、子和标志。当一个子项有自己的子项时,它也会出现在父项列中 层次结构没有标准化的级别,因此,一个成员可以将级别6作为最后一个级别,而另一个成员可以将其最后一个级别设置为3 例如:Sql 非标准化等级数据的更新,sql,oracle,hierarchy,Sql,Oracle,Hierarchy,我有一个包含三列的表:父、子和标志。当一个子项有自己的子项时,它也会出现在父项列中 层次结构没有标准化的级别,因此,一个成员可以将级别6作为最后一个级别,而另一个成员可以将其最后一个级别设置为3 例如: 1 - 1.1 -- 1.1.1 --- 1.1.1.1 - 1.2 -- 1.2.1 - 1.3 -- 1.3.1 --- 1.3.1.1 ----1.3.1.1.1 2 - 2.1 -- 2.1.1 ... 我需要的是更新父项以1开头的记录的标志,以及它的子项和子项的子项,等等。。。在这种
1
- 1.1
-- 1.1.1
--- 1.1.1.1
- 1.2
-- 1.2.1
- 1.3
-- 1.3.1
--- 1.3.1.1
----1.3.1.1.1
2
- 2.1
-- 2.1.1
...
我需要的是更新父项以1开头的记录的标志,以及它的子项和子项的子项,等等。。。在这种情况下,只有:
1
- 1.1
-- 1.1.1
--- 1.1.1.1
- 1.2
-- 1.2.1
- 1.3
-- 1.3.1
--- 1.3.1.1
----1.3.1.1.1
但请记住,表中的结构不是这样的,而是分为两列,如:
Parent |Child
1 1.1
1 1.2
1 1.3
1.1 1.1.1
1.1.1 1.1.1.1
1.2 1.2.1
...
提前感谢大家 如果我理解您的问题,您希望更新第一个父行的行。 您可以通过
connectby\u root
look来实现这一点
基本上(没有测试过)是这样的
update hierarchy_table h_outer
set flag = 'X'
where h_outer.rowid in (
select rid
from (
select h.row_id as rid , connect_by_root parent_id as root_parent
from hierarchy_table h
start with parent = null
connect by prior child_id = parent_id
)
where root_parent like '1%'
)
希望这能满足你的要求
UPDATE hierarchy_table a
SET a.flag = 'X'
WHERE a.ROWID IN (SELECT b.ROWID
FROM hierarchy_table b
START WITH b.PARENT = '1' -- Change start point here
CONNECT BY PRIOR b.child = b.PARENT);
其中
类子输入_parent_id | |'。%'
对您没有帮助?没有,因为层次结构不是这样组织的(这只是一个示例)。实际上,数据更像:(L1)CT-100000->(L2)CT-101022->(L3)CT-98009…我认为它正在生成笛卡尔坐标。听说过一种叫NOCYCLE的东西。。。也许这能帮上忙。。。我正在设置起点,但即使是查询也不会结束…只是想让您知道,层次结构并不像1,1.1那样组织。。。(这只是一个例子)。实际上数据更像:(L1)CT-100000->(L2)CT-101022->(L3)CT-98009…除非存在父子关系,否则数据是什么并不重要。这个查询在Oracle 11.0.0.1.0中非常适合我。此外,其解释计划没有显示任何笛卡尔坐标。但无论如何,这是一个很好的观点,最好提供别名。如果在某个时间点,父母的子女是先前的父母,而您的示例没有证明这一点,则需要NOCYCLE。