3

有谁知道如何根据它的 id 检索帐户的层次模型?

我尝试使用此查询,但我得到的只是第一组子节点。

select a.Name,a.parentId,a.ownerid,a.id from  Account a where Parent.id ='00711314'
4

4 回答 4

4

SOQL 不支持分层检索,您必须逐级检索,为每个级别生成一个 id 列表,然后使用in <list>where 运算符检索下一个级别。

请记住,尽管存在州长限制,如果您有大树,您将很容易遇到限制。

于 2011-03-31T22:13:17.127 回答
2

如前所述,您不能通过 SOQL 使用分层检索。当我需要其他对象的此功能时(并且当我知道有 < 10k 行时)我选择了所有记录,然后使用列表映射在内存中建立层次结构:

map<id, list<id>> mapParentToChildren = new map<id, list<id>>();

for(Record__c [] sRecordArr : [select Id, Parent__c from Record__c limit 10000])
{
    for(Record__c sRecord : sRecordArr)
    {
        if(mapParentToChildren.get(sRecord.Parent__c) == null)
        {
            mapParentToChildren.put(sRecord.Parent__c, new list<id>{sRecord.Id});
        }
        else
        {
            mapParentToChildren.get(sRecord.Parent__c).add(sRecord.Id);
        }
    }
}

然后,您可以使用递归函数对数据执行操作等,例如(未经测试):

// top level records will have a null parent, so be in the 'null' list
for(id idRecord : mapParentToChildren.get(null))
{
    PrintTree(idRecord, 0);
}

public void PrintTree(id idRecord, int iLevel)
{
    string strLevel = '*';

    for(integer i = 0; i < iLevel; i++)
    {
        strLevel += '*';
    }

    System.Debug(strLevel + idRecord);

    if(mapParentToChildren.get(idRecord) != null)
    {
        for(id idChild : mapParentToChildren.get(idRecord))
        {
            PrintTree(idChild, iLevel + 1);
        }
    }
}

此代码效率低且未经测试(我刚刚将此版本直接写入浏览器),但它应该让您了解如何在平台上处理分层数据。

于 2011-05-03T08:31:23.227 回答
0
select a.Name,a.parentId,a.ownerid,a.id from  Account a where a.parentId ='00711314'
于 2011-03-31T19:21:04.517 回答
0

如果您知道层次结构中的级别数量有限,并且您在每个级别查询有限数量的字段,则可以执行以下操作:

select Id, Name, ownerid, 
    parent.Id, parent.Name, parent.OwnerId, 
    parent.parent.Id, parent.parent.Name, parent.parent.OwnerId, 
    parent.parent.parent.Id, parent.parent.parent.Name, parent.parent.parent.OwnerId 
from Account where Parent.id ='00711314'

它很丑陋,但允许您在单个查询中获得固定数量的层次结构级别。

于 2015-02-09T21:52:07.387 回答