2011-03-31 4 views
2

ID를 기반으로 계정의 계층 모델을 검색하는 방법을 아는 사람 있습니까?계층 적 SOQL 쿼리

이 쿼리를 사용했지만 모든 자식 노드가 첫 번째 집합입니다.

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

답변

3

SOQL 계층 적 검색을 지원하지 않습니다, 당신은 각 레벨이 아이디의 목록을 생성하고 어디 운영자 in <list>를 사용하여 다음 단계를 검색하기위한 레벨로 레벨을 검색 할 수 있습니다.

주지사 제한 사항이 적용되지만 큰 나무가있는 경우 매우 제한이 많습니다.

1
select a.Name,a.parentId,a.ownerid,a.id from Account a where a.parentId ='00711314' 
+0

잘못된 ID 필드를 제공합니다 00711314 – karthick

+0

질문에 제공 한 ID를 사용하기 만하면 실제 Salesforce ID를 대신 사용해야합니다. –

2

이미 언급했듯이 SOQL로 계층 적 검색을 사용할 수 없습니다.

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

: 나는 다른 객체와이 기능을 필요로했다 (내가 < 10,000 행이 알고있을 때) 나는 모든 레코드를 선택한 때, 대신 메모리 계층 구조를 구축하기 위해 목록의지도를 사용 그런 다음 (테스트되지 않은) 예를 들어, 데이터 등의 작업을 수행 할 수 재귀 함수를 사용할 수있다 :

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

이 코드는 (난 그냥 바로 브라우저에이 버전을 작성했습니다) 비효율적이고 안된입니다 플랫폼에서 계층 적 데이터를 처리하는 방법에 대한 아이디어를 제공해야합니다.

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' 

그것은 추한하지만, 수 단일 쿼리에서 고정 된 수의 계층 구조 레벨을 얻을 수 있습니다.