Иерархический SOQL-запрос
Кто-нибудь знает, как получить иерархическую модель учетной записи на основе его идентификатора?
Я попытался использовать этот запрос, но все, что я получил, это первый набор дочерних узлов.
select a.Name,a.parentId,a.ownerid,a.id from Account a where Parent.id ='00711314'
4 ответа
SOQL не поддерживает иерархический поиск, вы должны извлекать уровень за уровнем, для каждого уровня генерировать список идентификаторов, а затем извлекать следующий уровень, используя in <list>
где оператор.
Имейте в виду, что эти ограничения применяются, и если у вас есть большие деревья, вы легко можете достичь предела.
Как уже говорилось, вы не можете использовать иерархический поиск с SOQL. Когда мне понадобилась эта функциональность с другими объектами (и когда я знаю, что < 10 тыс. Строк), я выбрал все записи, а затем использовал карту списков для построения иерархии в памяти:
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);
}
}
}
Этот код неэффективен и не проверен (я только что написал эту версию прямо в браузере), но он должен дать вам представление о том, как вы можете работать с иерархическими данными на платформе.
select a.Name,a.parentId,a.ownerid,a.id from Account a where a.parentId ='00711314'
Если вы знаете, что в вашей иерархии ограниченное количество уровней и запрашиваете ограниченное количество полей на каждом уровне, вы можете сделать что-то вроде этого:
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'
Это некрасиво, но позволяет получить фиксированное количество уровней иерархии в одном запросе.