通过对所有孩子的查询进行连接

问题描述:

有什么方法可以让Oracle中的connect prior... start with语句以表中的第一个“子”开始,然后为所有其余子项运行查询?我知道如何为1个孩子使用这个语句并获得它的祖先,但是我需要代码为表中的许多不同的孩子运行。通过对所有孩子的查询进行连接

让我们假设我有这样的代码,它从组件的表格和组件的父项中返回组件和组件的颜色,并将其分类为“Sample”及其颜色,其中组件的父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的循环类型。对不起,刚开始。

+0

您使用的是哪个版本的Oracle?版本11.2g支持也可用于此的递归CTE。 –

+1

你的“2000”是双引号,这意味着这是一个列名。这是正确的还是你的意思是使用单引号? CONNECT BY中的WHERE子句[在CONNECT BY之后评估](http://docs.oracle.com/cd/E11882_01/server.112/e41084/queries003.htm#sthref2221);你知道吗,你想要什么? – Ben

+0

@Ben:因为这个列是一个“ID”,它甚至可能不是一个字符列,但应该用作没有任何引号的数字值。 –

避免使用中的层次化查询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