Informix 11.50分层SQL

时间:2014-01-31 02:39:31

标签: sql informix hierarchical-data

我需要一点帮助informix 11.50层次结构数据SQL。我有下表:

create table cont_reln (
    contact char(10),
    relation_type char(1),
    related_to char(10));

contact   | relation_type   | related_to
1000        CH                2001
1000        CH                2002
1000        CH                2003
2001        CH                3001
2001        CH                3002
2002        CH                3003
2003        CH                3004
3004        CH                4001
4001        CH                5001

我写了两个可以联系的SQL,并找出所有父母和所有孩子:

-- Get the children
SELECT contact, related_to, LEVEL
   FROM cont_reln
      START WITH contact = '?'
      CONNECT BY NOCYCLE PRIOR  related_to = contact
   ORDER SIBLINGS BY related_to;   

-- Get the parents
SELECT contact, related_to, LEVEL    
   FROM cont_reln
    START WITH related_to = '?'    
      CONNECT BY NOCYCLE PRIOR contact = related_to
   ORDER SIBLINGS BY contact;

这些查询中的每一个都返回我所追求的内容,但我不确定如何将它们组合起来,以便在我开始使用任何联系号码时获得以下输出...那么,无论什么'?'是,如果它在此层次结构中的某个位置,则数据集将返回与下面完全相同的内容:

contact   | relation_type   | related_to
NULL        NULL              1000
1000        CH                2001
2001        CH                3001
2001        CH                3002
1000        CH                2002
2002        CH                3003
2003        CH                3004
3004        CH                4001
4001        CH                5001

我知道第一行(带有空值)必须在我知道根节点后作为单独的硬编码返回返回,但是从第2行 - >我不确定该怎么做。

有什么想法吗?

**编辑** 查找父项的查询不正确 - 已修复。

1 个答案:

答案 0 :(得分:1)

好的,我明白了。

在一个查询中不可能这样做,但在存储过程中它是微不足道的。

首先,我需要知道根节点(它与组合两个查询无关)。

要查找我运行的根节点:

SELECT 
  contact
FROM 
  cont_reln
WHERE 
  relation_type = 'CH'
  START WITH related_to = '?'
  CONNECT BY NOCYCLE 
    PRIOR contact = related_to 
    AND PRIOR related_to != related_to
ORDER SIBLINGS BY 
  contact

这是foreach,并且通过虚拟分层查询返回的方式,我总是知道最后一条记录是根。

从那里,我只是根据根联系人ID运行子选择。

SELECT 
  contact, 
  related_to
FROM 
  cont_reln
WHERE 
  relation_type = 'CH'
  START WITH contact = 'THE RETURNED ROOT NODE ID'
  CONNECT BY NOCYCLE PRIOR  related_to = contact
ORDER SIBLINGS by 
  related_to