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

Dav*_*e S 5 salesforce soql apex-code

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

 SELECT id, name, parent.id, parent.parent.id, parent.parent.parent.id,
 FROM Account WHERE id=CHILD_ID
Run Code Online (Sandbox Code Playgroud)

然后进行迭代,直到找到指示顶级帐户的空parent.id。不是很优雅,也不能保证“顶级”帐户,我更喜欢类似的东西

SELECT id, name, 
    (SELECT id, name, 
     FROM Accounts WHERE id = CHILD_ID)
FROM Account WHERE parent.id = null
Run Code Online (Sandbox Code Playgroud)

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

Dan*_* K. 5

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

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

您可以通过仅在查询中选择parent.id并执行更多单独的查询来使此操作更加优雅,但这将使您遇到API/调控器的限制,因此这可能不是一个好主意。

如果您可以使用自定义对象而不是帐户,则可以执行类似于第二个查询的操作,因为您将能够从该自定义对象到其自身遍历父子关系,但我仍然不确定是否存在单个查询即可满足您的需求。