Salesforce SOQL: получение родительских записей без дочерних записей

В Salesforce связи между объектами определяются с помощью отношений «родитель-потомок», где один объект является родительским, а другой — дочерним. При запросе данных с помощью языка запросов к объектам Salesforce (SOQL) вы можете столкнуться со сценариями, в которых вам необходимо получить родительские записи, у которых нет связанных дочерних записей. В этой статье блога мы рассмотрим различные методы выполнения этой задачи, используя разговорный язык, и предоставим примеры кода для каждого подхода.

Метод 1: использование левого внешнего соединения
Один из способов получения родительских записей без дочерних записей — использование левого внешнего соединения в запросе SOQL. Этот тип соединения возвращает все записи из левого объекта (родительского) и соответствующие записи из правого объекта (дочернего). Чтобы отфильтровать родительские записи без дочерних записей, вы можете включить предложение WHERE, которое проверяет наличие нулевых значений в поле дочерней связи.

List<Account> parentRecords = [SELECT Id, Name
                               FROM Account
                               LEFT OUTER JOIN Contacts
                               WHERE Contacts.Id = null];

Метод 2: использование подзапросов
Другой метод — использовать подзапросы для получения родительских записей, у которых нет связанных дочерних записей. Вы можете создать подзапрос для получения всех дочерних записей, а затем использовать предложение NOT IN, чтобы исключить родительские записи, у которых есть дочерние записи.

List<Account> parentRecords = [SELECT Id, Name
                               FROM Account
                               WHERE Id NOT IN (SELECT AccountId
                                                FROM Contact)];

Метод 3: использование преимуществ агрегированных запросов
Агрегированные запросы также можно использовать для получения родительских записей без дочерних записей. Сгруппировав дочерние записи и отфильтровав группы с нулевым числом, вы можете получить нужные родительские записи.

List<Account> parentRecords = [SELECT Id, Name
                               FROM Account
                               WHERE Id NOT IN (SELECT AccountId
                                                FROM Contact
                                                GROUP BY AccountId
                                                HAVING COUNT(Id) > 0)];

В этой статье мы рассмотрели три различных метода получения родительских записей без дочерних записей с помощью Salesforce SOQL. Используя левые внешние соединения, подзапросы или агрегатные запросы, вы можете эффективно отфильтровывать родительские записи, у которых нет связанных дочерних записей. В зависимости от вашего конкретного случая использования вы можете выбрать метод, который лучше всего соответствует вашим потребностям.

Не забудьте адаптировать примеры кода к конкретным именам объектов и полей. Приятного кодирования!