Salesforce / SOQL - 给孩子,如何返回“顶级”父帐户?

时间:2011-01-03 18:47:39

标签: salesforce apex-code soql

我有一个问题,我需要找一个孩子的顶级父帐户。我能做的最好的就是从孩子那里过滤掉

 SELECT id, name, parent.id, parent.parent.id, parent.parent.parent.id,
 FROM Account WHERE id=CHILD_ID

然后迭代直到找到指示顶级帐户的null parent.id。不是很优雅,不保证“顶级”帐户,我会更喜欢像

这样的东西
SELECT id, name, 
    (SELECT id, name, 
     FROM Accounts WHERE id = CHILD_ID)
FROM Account WHERE parent.id = null

但这不起作用,因为销售人员显然不允许您从一个帐户到另一个帐户遍历父子关系。有人在这有什么建议吗?

2 个答案:

答案 0 :(得分:4)

你是对的 - 在单个SOQL查询中无法做到这一点。请注意,您的第二个所需查询也不会给您正确的结果(如果子帐户的直接父级没有父级,它只会返回一条记录。)

您最好的选择是在第一个代码块中执行您所说的内容。您最多可以遍历5个对象的关系,因此您可以在SOQL选择中包含parent.parent.parent.parent.parent.id。遍历字段 - 如果它们都不为null,则发出第二个SOQL查询,将CHILD_ID更改为parent.parent.parent.parent.parent.id的值。这样你就可以保证最终找到没有父母的父母(因为salesforce不保证没有周期)。

你可以通过在查询中选择parent.id并进行更多的单独查询来使这更加优雅,但这会使你遇到API /调控器限制,所以这可能不是一个好主意。

如果您可以使用自定义对象而不是Account,您可以执行类似第二个查询的操作,因为您可以遍历从该自定义对象到其自身的父对子关系,但我仍然没有确定只有一个查询可以为您提供所需的信息。

答案 1 :(得分:1)

我在客户网站上遇到过很多次。我发现的最佳解决方案是一个名为“终极父母”的自定义字段,或者有时称为“法律实体”,但基本上是相同的。我们使用触发器来进行遍历。

基本思路是,无论何时创建一个子帐户帐户,都要将“终极父”字段复制到子记录中。

通常,我们将字段设置为查找,以便像您这样的查询更容易。它还允许您进行一些非常有趣的数据可视化。例如,通过使用父查找和最终父查找字段,您可以找到兄弟姐妹,堂兄弟,堂兄弟等帐户。