1

我在使用 connect by 时遇到问题。

我有一个查询,通过它我检索了几列,包括这三个:

  • ID
  • 父母ID
  • 对象 ID

现在对于相同的IDand 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

上面的查询没有导致我需要的适当的层次结构。

4

3 回答 3

4

好吧,您的问题似乎是您使用的是非规范化表设计。如果给定ID始终具有相同的ParentID,则不应在所有这些行中单独指示该关系。

更好的设计是有一个显示父子关系的表,ID作为主键,第二个表显示IDto的映射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)
于 2012-06-21T17:47:18.627 回答
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
于 2012-06-21T18:05:28.590 回答
0

首先感谢所有试图帮助我的人。

最后我改变了我的方法,因为将层次结构 CONNECT BY 子句应用于具有多个连接的内部查询对我不起作用。

我采取了以下方法

  1. 从第一个表(即具有 ID-ParentID 的表)中获取分层数据。使用 CONNECT BY 选择查询 table1。它将以正确的顺序给出 ID。加入检索到的 ID 列表。

  2. 将上述 ID 作为选择查询 IN 子句中的逗号分隔字符串传递给具有 ID-ObjectID 的第二个表。

select * from table2 where ID in (above Joined string of ID) order by instr('above Joined string of ID',ID);

ORDER BY INSTR做了魔术。它会给我按 IN 子句数据排序的结果,并且 IN 子句字符串是使用分层查询准备的。因此,它显然是按顺序排列的。

再次感谢大家的帮助!

注意:上述方法有一个约束:ID 在 IN 子句中作为逗号分隔的字符串传递。IN 子句中的字符数有限制。我猜1000个字符。没有把握。但正如我在第一张表的数据上确定的那样,它不会超过 1000 个字符的限制。因此我选择了上述方法。

于 2012-06-22T09:35:00.087 回答