我需要一点帮助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行 - >我不确定该怎么做。
有什么想法吗?
**编辑** 查找父项的查询不正确 - 已修复。
答案 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