我在使用connect by时遇到了一个问题。
我有一个查询,通过它我可以检索几个列,包括这三个:
现在对于相同的ID
和parentID
,有多个对象关联,例如
ID ParentID ObjectID
1 0 112
1 0 113
2 0 111
2 0 112
3 1 111
4 1 112
我正在尝试使用connect by
,但我无法将结果放在适当的层次结构中。我需要的方式如下所示。获取ID
- parentID
组合,显示包含ID-parentID
的所有行,然后显示此ID
的所有子项,即parentID
= ID
ID ParentID ObjectID
1 0 112
1 0 113
3 1 111
4 1 112
2 0 111
2 0 112
select ID,parent_id, object_id from table start with parent_id=0
connect by prior id=parent_id order by id,parent_id
以上查询未导致我需要的正确层次结构。
答案 0 :(得分:4)
好吧,您的问题似乎是您正在使用非规范化的表格设计。如果给定的ID
始终具有相同的ParentID
,则不应在所有这些行中单独指出该关系。
更好的设计是让一个表显示父子关系,ID
作为主键,第二个表显示ID
到ObjectID
的映射,我假设两个列一起构成主键。然后,您将对第一个表应用分层查询,并将其结果连接到另一个表,以获取每行的相关对象。
您可以使用当前的表格结构来模拟它......
with parent_child as (select distinct id, parent_id from table),
tree as (select id, parent_id from parent_child
start with parent_id = 0
connect by prior id = parent_id )
select id, table.parent_id, table.object_id
from tree join table using (id)
答案 1 :(得分:0)
这是一个运行的脚本。不理想,但会起作用 -
select * from (select distinct test.id,
parent_id,
object_id,
connect_by_root test.id root
from test
start with test.parent_id = 0
connect by prior test.id = parent_id)
order by root,id
答案 2 :(得分:0)
首先感谢所有试图帮助我的人。
最后我改变了我的方法,因为将层次结构CONNECT BY子句应用于内部查询,多个连接对我来说不起作用。
我采取了以下方法
从First表中获取分层数据,即ID为ParentID的表。使用CONNECT BY选择Query table1。它将以适当的顺序给出ID。 加入检索到的ID列表。
将选择查询IN子句中的上述ID作为逗号分隔字符串传递给ID为ObjectID的第二个表。
从table2中选择*其中ID(在加入的ID字符串上面)依次排序 instr('高于ID',ID的加入字符串);
ORDER BY INSTR
做了魔术。它将给出由IN子句数据排序的结果,并使用分层查询准备IN子句字符串。因此它显然会按顺序排列。
再次感谢大家的帮助!
注意:上面的方法有一个约束:ID在IN子句中以逗号分隔的字符串传递。 IN子句中包含字符数限制。我猜1000个字符。不确定。 但正如我对First表的数据所确定的那样,它不会超过1000个字符的限制。因此我选择了上述方法。