【问题标题】:oracle connect by multiple parentsoracle由多个父母连接
【发布时间】:2012-06-23 01:01:51
【问题描述】:

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

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

  • 身份证
  • 父母ID
  • 对象ID

现在对于相同的 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                                                                  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?你想要前两个级别的孩子吗?我不明白你想要达到什么目的。
  • @FlorinGhita 我想获取分层格式的数据。但事情与 ID 和 Parent ID 一起,我可以有多个对象 ID。在这种情况下如何使用 connect by。
  • 我认为您需要嵌套查询。内部查询将给出 Id 和 Parent Id 组合,外部查询将获取所有相关记录。
  • @padmarag 我正在使用嵌套查询。内部查询将产生三列数据,如上所示。但在那之后我无法应用 connectby 来获得确切的层次结构。

标签: oracle connect-by


【解决方案1】:

嗯,您的问题似乎是您使用的是非规范化表设计。如果给定的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)

【讨论】:

  • 但是你失去了排序,我认为这是 OP 真正关心的;您的查询(使用 OP 的数据)等同于 select * from table
  • 不过,您可以将rownum as rn 包含在从parent_child 中选择的选项中,最后是order by rn, table.object_id。这使我不必发布我正在研究的类似答案。
  • @DaveCosta 我的桌子设计和你提到的一样。第一个带有 ID 和 ParentID 的表。带有 ID 和 ObjectID 的第二个表。我已经尝试过首先从第一个表中获取分层查询然后将其与第二个表连接的方法。但是在这种方法中,层次顺序丢失了。它没有按照层次结构返回值。因此,我提出了这个问题,以便在连接的数据上应用层次结构。
  • @AlexPoole -- 当我如上所示尝试它时,它按照 OP 指示他正在寻找的顺序出现
  • @RS 好吧,我回复了您发布的信息,但并不表示任何内容。您在问题中显示的查询有一个 ORDER BY 子句,它显式地对 ID 上的行进行排序——如果这不是您想要的顺序,您为什么要这样做?
【解决方案2】:

这是一个运行的脚本。不理想但会工作 -

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

【讨论】:

    【解决方案3】:

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

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

    我采取了以下方法

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

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

    select * from table2 where ID in (joined string of ID) order by instr('上面加入的ID字符串',ID);

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

    再次感谢大家的帮助!

    注意:上述方法有一个约束:ID 在 IN 子句中以逗号分隔的字符串形式传递。 IN 子句中的字符数有限制。我猜1000个字符。没有把握。 但我确信第一表的数据不会超过 1000 个字符的限制。因此我选择了上述方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2011-11-03
      • 2011-08-15
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多