【问题标题】:A connect by query on all children对所有孩子的查询连接
【发布时间】:2013-08-26 11:53:54
【问题描述】:

有没有办法让 Oracle 中的 connect prior... start with 语句从表中的第一个“孩子”开始,然后对所有剩余的孩子也运行查询?我知道如何为 1 个孩子使用该语句并获取其祖先,但我需要为表中的许多不同孩子运行代码。

假设我有这个代码,它从组件表和组件的父级返回一个组件和组件的颜色,它被归类为“示例”,它的颜色,其中组件的父级 ID 是组件的父级 ID。

这是我的架构:

Components table:
Component        Component_ID      Component_Parent_ID      Component_Label

Component_Color Table:
Component      Component_Color

注意:这是示例代码,不是我实际使用的,所以如果你犯了愚蠢的错误,我很抱歉。

SELECT Component,
  FROM Components
 INNER JOIN Component_Color ON (Components.Component =  Component_Color.Component)
 WHERE Component_Label = 'Sample'
connect by prior  Component_Header.Component_Parent_ID = Component_Header.Component_ID
  start with Component.Component_ID = '2000'; 

表组件有很多不同的组件,我希望查询不仅返回 ID 为 2000 的组件及其“样本”父组件,而且还为表“组件”中的所有子组件执行此操作。

我可以看到如何使用循环来完成此操作,但我找不到可以用于 Oracle 的循环类型。对不起,刚开始。

【问题讨论】:

  • 您使用的是什么版本的 Oracle? 11.2g 版支持递归 CTE,也可用于此目的。
  • 您的“2000”用双引号括起来,这意味着这是一个列名。这是正确的还是您的意思是使用单引号? CONNECT BY 中的 WHERE 子句是evaluated after the CONNECT BY;你知道吗,这是你想要的吗?
  • @Ben:由于该列是“ID”,因此它可能甚至不是字符列,但应该用作不带引号的数值。
  • 听起来好像您希望以一组独特的层次结构结束,即始终从根开始。您必须首先计算根是什么才能执行此操作...或者您的表可能会以使您能够执行此操作的方式设置...例如最低 ID?跨度>
  • Gordon - 版本:版本 3.2.20.09,我认为我不能使用 CTE,但如果您知道任何其他方法,请告诉我。 Ben - 是的,对不起 - 我只是把它写成一个例子,并没有仔细检查它。谢谢你。我会解决的。

标签: sql oracle connect-by hierarchical-query


【解决方案1】:

避免在分层查询中使用WHEREORDER BY 子句,因为它们在分层处理之后运行。这里我认为你应该使用START WITH component_label = 'Sample'

 SELECT level, components.component_id, components.component_label, component_color.component_color
   FROM compenents JOIN component_color ON components.component = component_color.component
  START WITH components.component_label = 'Sample'
CONNECT BY PRIOR components.component_id = components.component_parent_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多