【发布时间】: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