Иерархический SOQL-запрос - PullRequest
2 голосов
/ 31 марта 2011

Кто-нибудь знает, как получить иерархическую модель учетной записи на основе ее идентификатора?

Я пытался использовать этот запрос, но все, что я получил, это первый набор дочерних узлов.

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

Ответы [ 4 ]

3 голосов
/ 01 апреля 2011

SOQL не поддерживает иерархическое извлечение, вы должны извлекать уровень за уровнем, для каждого уровня генерировать список идентификаторов, а затем извлекать следующий уровень, используя in <list> оператор where.

Имейте в виду, что применяются ограничения губернатора, и если у вас большие деревья, вы довольно легко столкнетесь с лимитом.

2 голосов
/ 03 мая 2011

Как уже говорилось, вы не можете использовать иерархический поиск с SOQL.Когда мне понадобилась эта функциональность с другими объектами (и когда я знаю, что <10k строк), я выбрал все записи, а затем использовал карту списков для построения иерархии в памяти: </p>

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);
        }
    }
}

Этот код неэффективен и не проверен (я только что написал эту версию прямов браузер), но он должен дать вам представление о том, как вы можете работать с иерархическими данными на платформе.

1 голос
/ 31 марта 2011
select a.Name,a.parentId,a.ownerid,a.id from  Account a where a.parentId ='00711314'
0 голосов
/ 10 февраля 2015

Если вы знаете, что в вашей иерархии существует ограниченное количество уровней, и вы запрашиваете ограниченное количество полей на каждом уровне, вы можете сделать что-то вроде этого:

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'

Это уродливо, нопозволяет получить фиксированное количество уровней иерархии в одном запросе.

...