4

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

 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

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

4

2 回答 2

4

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

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

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

如果您可以使用自定义对象而不是 Account,则可以执行第二个查询之类的操作,因为您将能够从该自定义对象遍历父子关系到自身,但我仍然不确定是否存在单个查询将为您提供所需的内容。

于 2011-01-03T19:32:58.007 回答
1

我在客户现场遇到过很多次。我找到的最佳解决方案是一个名为“Ultimate Parent”或有时称为“法律实体”的自定义字段,但基本上是一样的。我们使用触发器进行遍历。

基本思想是,每当您创建一个子帐户时,您都将“最终父级”字段复制到子记录中。

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

于 2011-02-11T06:42:40.083 回答