표준 개체로 관계 쿼리 만들기
학습 목표
이 유닛을 완료하면 다음을 수행할 수 있습니다.
- 두 가지 유형의 관계 쿼리에 대해 설명할 수 있습니다.
- 두 개체 사이의 관계를 식별할 수 있습니다.
- 점 표기법을 사용하는 하위-상위 쿼리를 만들 수 있습니다.
- 보조 쿼리를 사용하는 상위-하위 쿼리를 만들 수 있습니다.
- 보조 쿼리를 사용하여 쿼리 결과를 필터링할 수 있습니다.
Trail Together로 함께 따라하기
이 단계를 진행하면서 전문가와 함께 따라하고 싶으세요? Trailhead Live의 Trail Together 시리즈에 포함된 이 비디오를 시청하세요.
(뒤로 돌려 단계를 처음부터 다시 보고 싶은 경우, 이 클립은 36:18분 표식에서 시작된다는 것을 기억하세요.)
관계 쿼리
Salesforce 관리자로서 여러분은 이미 관련 레코드에서 데이터를 가져오는 수식 필드에 익숙할 것입니다. 이제 개체 관계에 대한 지식을 SOQL 쿼리 작성에 적용할 수 있습니다.
FROM 절은 하나의 개체로 제한되지만 관계 쿼리를 사용하면 두 개의 관련 개체에 액세스할 수 있습니다. 관계 쿼리는 서로 다른 두 개체 간의 관계에 따라 두 개체 모두에서 필드를 반환합니다. 교차 개체 쿼리라고 생각하시면 됩니다.
다음 요구 사항을 고려하세요.
'Get a list of all contacts with each contact’s account name.(각 연락처의 계정 이름을 사용해 모든 연락처 목록을 가져옵니다.)'
Contact(연락처) 개체를 쿼리할 수 있지만 여기에 Account Name(계정 이름) 필드는 없습니다. 계정 이름은 실제로 Contact(연락처)와 관련된 Account(계정)의 Name(이름) 필드입니다. 조직에서는 수식 필드를 사용하여 모든 관련 개체의 필드에 액세스합니다. Apex에서는 관계 쿼리를 사용하지만 관계 쿼리의 유형은 두 개체가 어떻게 관련되어 있는지에 따라 달라집니다.
레코드를 얻는 방법:
- 하위 개체에 대한 레코드를 얻고 관련 상위 개체에 있는 필드를 포함하려면 하위-상위 쿼리를 사용합니다.
- 상위 개체에 대한 레코드를 얻고 관련 하위 개체에 있는 필드를 포함하려면 상위-하위 쿼리를 사용합니다.
사용할 쿼리 유형을 결정하려면 먼저 두 개체인 Contact(연락처)와 Account(계정)가 어떻게 관련되어 있는지 파악해야 합니다. 어느 쪽이 상위이고 어느 쪽이 하위인가요?
개체의 관계 식별
여러분은 관리자로서 조직의 마스터-세부 정보 관계에 익숙할 것입니다. 마스터-세부 정보 관계는 상위-하위 관계입니다. 마스터 개체가 상위이고, 세부 정보 개체가 하위입니다. 쿼리에 포함할 두 개체가 마스터-세부 정보 관계인 경우 어느 쪽이 상위이고 어느 쪽이 하위인지 알아야 합니다.
쿼리에 포함할 두 개체에 대해 익숙하지 않거나 두 개체가 어떻게 관련되어 있는지 모르는 경우 개체 관리자에서 개체를 살펴보세요. 하위일 가능성이 높은 개체부터 시작해서 필드 및 관계를 살펴봅니다. 상위 개체에 연결할 수 있는 필드 이름을 찾습니다.
예를 들어 Contact(연락처)에는 AccountId 필드와 Lookup(Account) 데이터 형식이 있습니다. 코드에는 필드 레이블(Account Name)이 아닌 필드 이름(AccountId)이 필요하다는 점을 기억하세요.
AccountId 필드의 세부 정보에서 Child Relationship Name(하위 관계 이름)이 Contacts(복수형)입니다. 기본적으로 표준 개체의 관계 이름은 하위 개체 이름의 복수 형식입니다.
Child Relationship Name(하위 관계 이름)을 통해 Contact(연락처)가 Account(계정)의 하위 요소라는 것을 알 수 있습니다. 또한 상위-하위 쿼리에 필요한 관계 이름도 알 수 있습니다(이 유닛의 뒷부분에서 설명).
하위-상위 쿼리 만들기
이제 Contact(연락처)와 Account(계정)가 하위-상위 관계라는 점을 알았습니다. Contact(연락처)가 하위이고, Account(계정)가 상위입니다. 모든 연락처(하위) 및 각 연락처의 계정(상위) 이름을 반환하려면 하위-상위 쿼리가 필요합니다.
하위-상위 쿼리에서는 다음과 같이 점 표기법을 사용하여 하위 개체를 쿼리하고 상위 개체에서 필드를 가져옵니다.
SELECT Name, Account.Name FROM Contact
이 SELECT 명령문은 Contact(연락처) 개체를 쿼리합니다. SELECT 절에서 Name
(이름)은 Contact(연락처)의 Name(이름) 필드이고 Account.Name
은 Contact(연락처)와 관련된 Account(계정)의 Name(이름) 필드입니다.
하위-상위 쿼리 실행하기
- Developer Console의 쿼리 편집기에서 다음을 입력합니다.
SELECT Name, Account.Name FROM Contact
- Execute(실행)를 클릭합니다.
결과의 첫 여섯 개 행이 다음과 같아야 합니다.
쿼리 결과 - 총 행 수: 20 |
|
이름 |
Account.Name |
Rose Gonzales |
Edge Communications |
Sean Forbes |
Edge Communications |
Jack Rogers |
Burlington Textiles Corp of America |
Pat Stumuller |
Pyramid Construction Inc. |
Andy Young |
Dickenson plc |
Tim Barr |
Grand Hotels & Resorts Ltd |
두 번째 열에는 연락처의 상위 계정 개체에서 가져온 계정 이름이 표시됩니다.
상위-하위 쿼리 만들기
이제 상위 개체를 쿼리하고 하위 개체에서 필드를 가져오는 방법을 살펴보겠습니다. 상위-하위 쿼리에서는 보조 쿼리를 사용하여 하위 개체에서 필드를 가져옵니다. 보조 쿼리는 괄호로 둘러싸여 다른 쿼리 내에 중첩된 SELECT 문입니다.
요구 사항은 다음과 같습니다.
'For every account, return the account name and the name of each related contact.(모든 계정에 대해 계정 이름 및 관련된 각 연락처의 이름을 반환합니다.)'
'of each related(관련된 각)'이라는 부분에서 관계 쿼리가 필요하다는 것을 알 수 있습니다. Contact(연락처)가 Account(계정)의 하위 요소이므로 하위 개체의 보조 쿼리를 포함하는 상위-하위 관계 쿼리가 필요합니다.
요구 사항의 첫 번째 부분인 'For every account, return the account name'이 기본 쿼리가 되어 전체 쿼리의 바깥 부분을 구성합니다. 요구 사항의 두 번째 부분인 'the name of each related contact'가 기본 쿼리 내에 중첩된 안쪽 쿼리인 보조 쿼리가 됩니다.
우선 기본 쿼리를 정의합니다. SELECT Name FROM Account
다음으로 괄호 안에 보조 쿼리를 정의합니다. (SELECT Name FROM Contact)
그런 다음 기본 쿼리의 두 번째 필드인 것처럼 보조 쿼리를 배치합니다. 다음과 같이 Name 뒤에 쉼표를 추가하고 보조 쿼리를 삽입합니다.
보조 쿼리 내에서 관련 개체의 필드 이름 대신 하위 관계 이름을 사용합니다. 마지막 단계에서는 다음과 같이 개체 이름인 Contact
를 하위 관계 이름인 Contacts
로 바꿉니다.
이 쿼리는 모든 계정의 계정 이름과 모든 연락처 이름을 반환합니다. 세부적으로 살펴보겠습니다.
이 쿼리는 세 부분으로 실행됩니다.
- 쿼리가 계정을 선택하고 계정 Name(이름) 필드를 가져옵니다. 이것이 기본 쿼리(바깥쪽 쿼리)가 됩니다.
- 그런 다음, 쿼리가 계정의 관련 연락처를 조회하고 각각에 대한 Name(이름) 필드를 가져옵니다. 이것이 보조 쿼리(안쪽 쿼리)가 됩니다.
- 그러면 다음 계정으로 이동하고 모든 계정을 선택할 때까지 과정을 반복합니다.
상위-하위 쿼리 실행
- 쿼리 편집기에서 다음을 입력합니다.
SELECT Name, (SELECT Name FROM Contacts) FROM Account
- Execute(실행)를 클릭합니다.
결과의 첫 여섯 개 행이 다음과 같아야 합니다.
쿼리 결과 - 총 행 수: 12 |
|
이름 |
연락처 |
Edge Communications |
[{"Name":"Rose Gonzalez"},{"Name":"Sean Forbes"}] |
Burlington Textiles Corp of America |
[{"Name":"Jack Rogers"}] |
Pyramid Construction Inc. |
[{"Name":"Pat Stumuller"}] |
Dickenson plc |
[{"Name":"Andy Young"}] |
Grand Hotels & Resorts Ltd |
[{"Name":"John Bond"},{"Name":"Tim Barr"}] |
United Oil & Gas Corp. |
[{"Name":"Arthur Song"},{"Name":"Avi Green"},{"Name":"Lauren Boyle"},{"Name":"Stella Pavlova"}] |
흥미롭네요! Query Results(쿼리 결과) 창에 계정 이름과 각 계정에 연결된 하위 연락처 레코드 컬렉션이 표시됩니다. 이러한 컬렉션 유형은 관리자를 위한 개체 지향 프로그래밍 모듈에서 맵을 살펴봤기 때문에 이미 익숙하실 것입니다.
맵에 대해 기억하지 못하셔도 괜찮습니다. 다시 확인해 볼게요. 맵 컬렉션은 쉼표로 구분된 키-값 쌍을 포함합니다. 키는 Name(이름)과 같은 필드 이름입니다. 키 뒤에는 Jake Llorrac 등의 값이 붙습니다. 키 값 쌍은 계정과 관련된 연락처를 쿼리하는 중첩된 SELECT 문에 의해 반환됩니다.
보조 쿼리로 필터링하기
성이 Forbes인 관련 연락처를 가진 계정만 원한다고 가정해 보겠습니다. 이 경우 하위 개체인 Contact(연락처)의 값을 기준으로 상위 개체인 Account(계정)를 필터링해야 하므로 작업이 까다롭습니다. 기본 쿼리 내에 보조 쿼리를 중첩한 것과 같은 방식으로 기본 쿼리의 WHERE 절에서 (하위 개체의) 보조 쿼리를 사용할 수 있습니다. 보조 쿼리의 결과는 기본 쿼리의 필터와 같은 역할을 합니다. 교차 필터에 익숙하다면 보조 쿼리에 WHERE 절을 추가하는 것은 보고서에서 교차 필터를 사용하는 것과 같습니다.
다음과 같은 기존 쿼리로 시작합니다.SELECT Name, (SELECT Name FROM Contacts) FROM Account
그런 다음 Forbes라는 성을 가진 연락처에서 AccountId 필드를 가져오는 보조 쿼리가 필요합니다.
(SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
왜 연락처의 AccountId 필드가 필요한지 궁금해하실 수 있습니다. 연락처의 AccountId 필드를 확인하여 계정과 관련된 연락처를 찾습니다. Contact 개체의 AccountId 필드와 Account 개체의 Id 필드가 동일한 값(Contact.AccountId = Account.Id
)을 갖는다면 연락처가 계정과 관련이 있는 것입니다. 따라서 Contact 개체를 쿼리하면 해당 AccountId 값이 반환됩니다. 연락처와 관련된 계정을 선택하려면 Id 필드에서 해당 값을 갖는 계정을 찾습니다.
마지막으로 기본 쿼리에 WHERE 절을 추가합니다. 보조 쿼리에 의해 반환된 Contact의 AccountId 필드에 Id가 있는 경우에만 Account 레코드를 선택하려고 합니다. 따라서 다음과 같이 WHERE Id IN
뒤에 보조 쿼리를 추가합니다.
SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
이 쿼리는 4가지 작업을 실행합니다.
- 쿼리가 성이 Forbes인 연락처를 찾고 각 연락처의 AccountId 필드 값을 반환합니다. (WHERE 절 보조 쿼리가 이를 실행합니다.)
- 다음으로 계정의 Id 필드에서 해당 AccountId 값을 찾고 해당 계정의 이름을 가져옵니다. (기본 WHERE 절이 이를 실행합니다.)
- 그런 다음 쿼리가 계정의 관련 연락처를 조회하고 각 연락처의 이름을 가져옵니다. (기본 쿼리의 보조 쿼리가 이를 실행합니다.)
- 마지막으로 기본 쿼리가 성이 Forbes인 관련 연락처를 가진 각 계정의 이름과 각 계정에 대한 모든 관련 연락처의 이름을 반환합니다.
필터링된 쿼리 실행
- 쿼리 편집기에서 다음을 입력합니다.
SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
- Execute(실행)를 클릭합니다.
결과는 다음과 같아야 합니다.
요약
지금까지 표준 개체에 대해 올바른 유형의 관계 쿼리를 선택하고 작성하는 방법을 살펴봤습니다. 다음 유닛에서는 사용자 정의 개체의 관계 쿼리에 대해 알아보겠습니다.