2017-06-29 117 views
0

我正在使用Salesforce Datawarehouse的报表。基本上,给一个特定的帐户,我需要为此找到层次结构。这可能在任何级别下降,但它必须得到所有的NODES。帐户层级Salesforce帐户 - SQL Server

以下是我:

WITH tree (id, parentid, level, name) as 
(
    SELECT id, parentid, 0 as level, name 
    FROM accounts 
    WHERE (parentid IS NULL 
    AND recordtypeid NOT IN ('012G0000001NLJSIA4', '012G0000001NLKGIA4')) 

    UNION ALL 

    SELECT c2.id, c2.parentid, tree.level + 1, c2.name 
    FROM accounts c2 
    INNER JOIN tree ON tree.id = c2.parentid 
    AND recordtypeid NOT IN ('012G0000001NLJSIA4', '012G0000001NLKGIA4') 
) 
SELECT * 
FROM tree 

我真的应该能够做的是提供一个帐户的参数,其细节我寻找并让它只返回层次结构这一点。

任何帮助?我现在一直在努力挣扎几天。

回答

0

不确定您的账户ID的数据类型是什么;不过,我保持安全并选择了INT。所有你需要做的就是使用一个参数作为CTE的锚点部分,并且将被定义为级别0,递归部分返回给定父级的所有子级。你为什么不尝试以下内容:

Declare @id INT = 1234; 

WITH tree (id, parentid, level, name) as 
(
    SELECT id, parentid, 0 as level, name 
    FROM accounts 
    WHERE id = @id 
    AND recordtypeid NOT IN ('012G0000001NLJSIA4', '012G0000001NLKGIA4') 

    UNION ALL 

    SELECT c2.id, c2.parentid, tree.level + 1, c2.name 
    FROM accounts c2 
    INNER JOIN tree ON tree.id = c2.parentid 
    AND recordtypeid NOT IN ('012G0000001NLJSIA4', '012G0000001NLKGIA4') 
) 
SELECT * 
FROM tree 
+0

嗯,这不完全工作。它似乎只能让我在子节点上下前进。但它也应该得到所有的节点,并且基本上它的所有父母也是如此。 – a415

+0

这似乎是你要求的。如果你需要上升,你需要第二个CTE(可以加入“树”),并在某个点开始,即参数,并简单地找到它的父节点。你将会得到的唯一乐趣就是获得每个人的正确等级,因为你会从等级中间的某个孩子开始。 – Eli