【问题标题】:Hierarchical Query sql分层查询sql
【发布时间】:2014-07-09 13:34:28
【问题描述】:

更新问题!

我有一个带有父子属性的表:

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

如果临时表的值为“green”,则结果为。结果2

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 无颜色”。

【问题讨论】:

  • 关系数据库管理系统?更好地解释您查询的目标是什么,我想我不是唯一一个不了解您试图实现的目标的人......
  • 由于使用了connect by而添加了oracle标签
  • 添加了 oracle 标签,因为 nvl()CONNECT BY ... PRIOR 是非常特定于 oracle 的。
  • 为什么要排除“名称 1.1.3.1”?抱歉,您的问题描述不是很清楚。
  • 您的问题中仍然缺少信息。请考虑删除您的 cmets 并将它们编辑到您的问题中。为什么搜索nocolour时不显示Name2

标签: sql oracle


【解决方案1】:

这将返回所有条目,它们至少有一个没有颜色的递归子节点 (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'
 )

【讨论】:

  • 您的问题并不清楚。只需将您现有的NVL 添加到我的查询中,就可以了。
  • 我假设你不想要1.1.3.1.1,因为它没有属性为green 的孩子。除非您对其进行编辑以添加更多信息,否则我将无法回答您的问题。
  • 查看我的编辑。如果这仍然不能解决您的问题,请更新您的答案!
  • 不,不是。我不知道你为什么想要没有孩子的name 1.1.3.1.1 green,而不是Name 1.1.3.1 no colour
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多