如何在 Netezza 中使用自加入查找父记录
Posted
技术标签:
【中文标题】如何在 Netezza 中使用自加入查找父记录【英文标题】:How to find the parent record using self join in Netezza 【发布时间】:2013-09-30 07:56:01 【问题描述】:我有一个带有键(即数字)作为 org_key 和 par_org_key 的表
组织键 | Par_Org_key 52 26 23 89 26 14 14 8在上表中 org_key 52 的父级是 26,org_key 26 的父级是 14 等等 上述系列的根父级是 8(因为它没有在 org_key 列中列出)。 我需要找到这样的根并拥有完整的链接,例如:单行上的 8|14|26|52。
此 SQL 在 Oracle 中运行:
select
substr(sys_connect_by_path(org_nbr,'|'),2) spa
,substr(sys_connect_by_path(org_key,'|'),2) org_key_line
,connect_by_root(org_key) org_key_root
,level lvl
,org.*
from org
start with par_org_key is null
connect by par_org_key = prior org_key
我的问题是,如何使用 Netezza SQL 执行相同的查询?
【问题讨论】:
Netezza 在这里是相当晦涩的话题。在dba.stackexchange.com 上问这个问题可能会更好 【参考方案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;
如果您想添加更多左外连接以支持未知数量的级别,这可以帮助处理导致的空值
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)),'')
【讨论】:
以上是关于如何在 Netezza 中使用自加入查找父记录的主要内容,如果未能解决你的问题,请参考以下文章