根据排除的路径选择非排除路径的父节点

时间:2011-02-03 02:26:21

标签: sql postgresql

假设我在sql表中有以下内容:

path
------
/
/a
/a/a
/a/b
/a/b/c
/b

我将至少标记一条路径作为排除,然后执行“选择未排除的父节点列表”查询。

各种情况的理想输出如下:

Scenario  Excluded Path(s)  Desired Output  Remarks
1         /a                /b              because /a/a, /a/b, /a/b/c are children of /a

2         /b                /a

3         /a/b              /a              because /a/a is not excluded
                            /b

4         /a/a              /b              because /a/b/c is the only child of /a/b
          /a/b/c                            and /a/a and /a/b are children of /a

2 个答案:

答案 0 :(得分:1)

所以要更完整地说明:

For a given path P, find top-level nodes 
having any children not on path P

然而,第三和第四个期望的结果似乎不遵循这个规则,所以要么为时已晚,我不应该回答这个问题,或者规则没有明确定义。

无论如何,使用字符串在SQL中执行此操作很棘手,但我会假设它们都是一个字母并用斜杠分隔。

select left(path,1) as topNode
  from theTable
 where path not like '/x/y%'
 group by left(path,1)

如果它们不是一个字母,我认为它们不是,我们必须检查它们是如何存储在表格中的。

答案 1 :(得分:0)

如果我理解你,你的问题与“节点”和“路径”几乎没有关系。您只是在寻找不以指定前缀开头的字符串(路径)。 如果是这样,问题很简单,请查看here