oracle由多个父母连接

时间:2012-06-21 15:53:36

标签: oracle connect-by

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

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

  • ID
  • PARENTID
  • 的ObjectID

现在对于相同的IDparentID,有多个对象关联,例如

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

以上查询未导致我需要的正确层次结构。

3 个答案:

答案 0 :(得分:4)

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

更好的设计是让一个表显示父子关系,ID作为主键,第二个表显示IDObjectID的映射,我假设两个列一起构成主键。然后,您将对第一个表应用分层查询,并将其结果连接到另一个表,以获取每行的相关对象。

您可以使用当前的表格结构来模拟它......

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子句应用于内部查询,多个连接对我来说不起作用。

我采取了以下方法

  1. 从First表中获取分层数据,即ID为ParentID的表。使用CONNECT BY选择Query table1。它将以适当的顺序给出ID。 加入检索到的ID列表。

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

  3.   

    从table2中选择*其中ID(在加入的ID字符串上面)依次排序   instr('高于ID',ID的加入字符串);

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

    再次感谢大家的帮助!

    注意:上面的方法有一个约束:ID在IN子句中以逗号分隔的字符串传递。 IN子句中包含字符数限制。我猜1000个字符。不确定。 但正如我对First表的数据所确定的那样,它不会超过1000个字符的限制。因此我选择了上述方法。