2013-09-30 56 views
1

我有钥匙(即只能使用数字)作为org_key和par_org_key如何使用自寻父纪录加盟Netezza公司

 
Org_key | Par_Org_key 
52  26 
23  89 
26  14 
14  8 

在上面tablem org_key 52的父母是26,父表org_key 26是14等等 上述系列的根父级为8(因为它未在org_key列中列出)。 我需要找到这样的根,并在单个行上有完整的链接,例如:8 | 14 | 26 | 52。

这个SQL是工作在甲骨文:

​​

我的问题是,我该怎么办利用Netezza公司的SQL相同的查询?

+0

Netezza在这里是相当晦涩的话题。在http://dba.stackexchange.com上问你可能会更好 – mvp

回答

1

Netezza不支持递归公用表表达式,否则这将是更优雅和可扩展的解决方案。我发现最好的解决方法是使用左外连接到同一个表。

创建测试表。我们使用-1来表示根节点。

CREATE TABLE t1 AS 
SELECT 52 AS Org_key, 26 AS Par_Org_key 
UNION 
SELECT 23 AS Org_key, 89 AS Par_Org_key 
UNION 
SELECT 26 AS Org_key, 14 AS Par_Org_key 
UNION 
SELECT 14 AS Org_key, 8 AS Par_Org_key 
UNION 
SELECT 8 AS Org_key, -1 AS Par_Org_key; 

这将返回8 | 14 | 26 | 52

SELECT NVL(a.Org_key,'0') || '|' || NVL(b.Org_key,'0') || '|' || NVL(c.Org_key,'0') || '|' || NVL(d.Org_key,'0') 
FROM t1 a 
LEFT OUTER JOIN t1 b ON a.Org_key = b.Par_Org_key 
LEFT OUTER JOIN t1 c ON b.Org_key = c.Par_Org_key 
LEFT OUTER JOIN t1 d ON c.Org_key = d.Par_Org_key 
LEFT OUTER JOIN t1 e ON d.Org_key = e.Par_Org_key 
WHERE a.Par_Org_key = -1; 

如果你想添加更多的左外连接,以支持一个未知的数量水平,这可以帮助处理导致

的NULL
SELECT NVL(CAST(a.Org_key AS VARCHAR(10)),'') || '|' || NVL(CAST(b.Org_key AS VARCHAR(10)),'') || '|' || NVL(CAST(c.Org_key AS VARCHAR(10)),'') || '|' || NVL(CAST(d.Org_key AS VARCHAR(10)),'')