2012-03-26 22 views
0

我试图递归地获取一些数据使用连接,我需要知道是否在不同的树中包含特定项目。访问使用连接通过在Oracle中的子句中的子查询中的父别名

所以我有这个[精简]查询:

select m.id, m.name, 
    (select (
    with recursiveMetaClass as (
      select mb.name 
      from meta mb 
      start with mb.id = m.id 
      connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
    ) select name from recursiveMetaClass where name in ('config_group', 'config_item') 
    ) from dual) as basetype 
from meta m 
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 

这错误虽与ORA-00904 “M”, “ID”:在开始m.id无效的,在我的嵌套查询。如果我用以下查询替换:

select m.id, m.name, 
    (select (
    with recursiveMetaClass as (
      select mb.name 
      from meta mb 
      start with mb.id = 1004 
      connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
    ) select name from recursiveMetaClass where name in ('config_group', 'config_item') 
    ) from dual) as basetype 
from meta m 
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 

它的工作原理(只是给出了错误的结果)。

我怎样才能让m.id进入那个开始,或重构这个工作?我也尝试使用一些嵌套的选择,并通过级别desc做rownumber = 1的顺序,但是当我试图引用m.id时,我得到了完全相同的错误。

谢谢!

+0

Oracle9i版本9.2.0.7.0 - 64生产 – Craig 2012-03-26 19:31:50

+0

我不是真的在这方面的专家,但如果你尝试使用非别名的版本会发生什么? '从mb.id = meta.id'开始 – 2012-03-26 19:33:05

+0

非剥离版本有多个到元的连接,所以这是行不通的。 – Craig 2012-03-26 19:39:55

回答

1

难道你不能简化这个查询以下?

select m.id, m.name, 
(  select mb.name 
     from meta mb 
     where name in ('config_group', 'config_item') 
     start with mb.id = m.id 
     connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
) as basetype 
from meta m 
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 
+0

哇,我想通过将停止当名称不在这两个之一,而不是忽略该行,但继续加入。谢谢! – Craig 2012-03-26 20:28:55

相关问题