Salesforce/SOQL-给定子项,如何返回;顶层;家长帐户?

Salesforce/SOQL-给定子项,如何返回;顶层;家长帐户?,salesforce,apex-code,soql,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,

我有一个问题,我需要找到一个孩子的顶级家长帐户。我所能做的最好的事情就是从孩子身上过滤出来

 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

但这不起作用,因为salesforce显然不允许您遍历帐户之间的父子关系。这里有人有什么建议吗?

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

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

只需在查询中选择parent.id并执行更多的单独查询,就可以使这一点更加优雅,但这会使您遇到API/调控器的限制,因此这可能不是一个好主意


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

我在客户站点多次遇到过这种情况。我找到的最佳解决方案是一个名为“最终家长”或有时称为“法律实体”的自定义字段,但基本上是一样的。我们使用触发器进行遍历

基本思想是,无论何时创建一个作为子帐户的帐户,都要将“最终父级”字段复制到子记录中


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

是的,我最终使用了“获取尽可能多的数据”方法,代码非常难看,但我想现在可以使用了,谢谢