分层查询sql

时间:2014-07-09 13:34:29

标签: sql oracle

更新的问题!

我有一个包含父子属性的表:

Parent_Id  Child_Id         Atribute1    Atribute2(colour)
---------- ----------       ----------   ----------
            1               name1        null 
            2               name2        null
      1     3               name1.1      null
      3     4               name1.1.1    grenn
      3     5               name1.1.2    green
      3     6               name1.1.3    null
      1     7               name1.2      null
      7     8               name1.2.1    green
      7     9               name1.2.2    green

临时表,用于保存选定的值(颜色)

Colour 
------
noclour
green

表中的层次结构如下所示:

Name2                 no colour
Name1                 no colour         
  Name 1.1            no colour
    name 1.1.1        green
    name 1.1.2        green
    name 1.1.3        no colour
  Name 1.2            no colour
    name 1.2.1        green
    name 1.2.2        green

我在临时表中保存了值。如果临时表具有价值' nocolour'那么层次结构表的结果就是。结果1:

Name1               no colour
  Name 1.1          no colour
    name 1.1.3      no colour

如果临时表有价值'绿色'然后结果会是。 RESULT2

Name1               no colour
  Name 1.1          no colour
    name 1.1.1      green
    name 1.1.2      green
  Name 1.2          no colour   
    name 1.2.1      green
    name 1.2.2      green

我的查询:

Select * from table
where child_id in (select child_id from table
                   start with nvl(attribrute2, 'nocolour') in (select colour
                                                               from tmp_table)
                   connect by prior parent_id = child_id
                   )

如果在tmp_table中值为绿色,那么我的代码工作正常,我得到Result2,但如果在tmp_table中是值' nocolour'然后我得到

Name2                  no colour
Name1                  no colour         
  Name 1.1             no colour
    name 1.1.3         no colour
  Name 1.2             no colour

但我想得到Result1。 附:我不会更新父子表并将空值更改为“nocolour'”。 有答案的想法吗?

当我选择“没有颜色”时,我不需要Name2,因为它没有任何孩子。我不需要名称1.2,当我选择“没有颜色”时,因为名称1.2只有颜色的子项,那么这意味着该父项具有没有空值的子项( '绿色'颜色)。

行。任何人都可以只选择空子吗?在这个例子中,它将是"名称1.1.3没有颜色"。

1 个答案:

答案 0 :(得分:0)

这将返回所有条目,这些条目至少有一个没有颜色的递归子项(SqlFiddle):

SELECT Child_Id, Attribute1
FROM (
  SELECT LEVEL AS lvl, Table1.*
  FROM Table1
  START WITH Attribute2 IS NULL
  CONNECT BY PRIOR parent_id = child_id
)
WHERE lvl > 1
GROUP BY Child_Id, Attribute1
;

结果:

CHILD_ID    ATTRIBUTE1
1           name1
3           name1.1
6           name1.1.3

编辑:此查询返回所有具有所请求颜色的子项(非递归)的记录:

SELECT *
  FROM Table1 parent
 WHERE EXISTS
 (
   SELECT 1
   FROM Table1 child
   WHERE child.Parent_id = parent.Child_Id
   AND NVL(child.Attribute2, 'nocolour') = 'green'
 )