Включить дополнительные условия в один запрос SOQL

У меня есть сборка SOQL следующим образом:

SELECT Subject, IsChild, StartDateTime, Owner.UserName, Owner.Email, Notes_Universal_ID__c, Location, IsPrivate, IsDeleted, Id, EndDateTime, Description, ShowAs, (SELECT Id, Status, Response, EventId, RelationId, Relation.Email FROM EventRelations) FROM Event where Subject = 'Test Meeting 3' and IsChild = false

В том же запросе я ищу выполнение дополнительной проверки Sync_contacts_and_cal_with_Notes__c = true из объекта пользователя как для владельца, так и для посетителей.

Возможно ли, может кто-нибудь помочь мне с запросом?

Спасибо!


person Abhi    schedule 13.06.2013    source источник


Ответы (1)


Это будет немного сложно.

Основная идея проста, просто добавьте 2 предложения WHERE. (Я пропускаю большинство ваших полей, чтобы изменение было более заметным):

SELECT Subject, Owner.UserName, Owner.Email,
    (SELECT Status, Response, RelationId, Relation.Email 
    FROM EventRelations
    WHERE Relation.Sync_contacts_and_cal_with_Notes__c = true)
FROM Event 
WHERE Subject = 'Test Meeting 3' AND IsChild = false
    AND Owner.Sync_contacts_and_cal_with_Notes__c = true

Однако это будет фильтровать по обеим таблицам.

2 пользователя: "Алиса" не имеет флажка, "Боб" имеет.

Если у вас есть мероприятие, принадлежащее "Алисе" - все ее мероприятия не будут синхронизированы, даже если "Боб" является одним из участников некоторых из них и хотел бы их увидеть!


Один из способов — просто включить флаг в SELECT и вручную отфильтровать записи в коде.

Другой вариант — изменить отношение, начать поиск с EventAttendee вверх и использовать фильтр ИЛИ:

SELECT Status, RelationId, RelationEmail, 
    Event.OwnerId, Event.Owner.Email
FROM EventAttendee
WHERE Owner.Sync_contacts_and_cal_with_Notes__c = true
    OR Event.Owner.Sync_contacts_and_cal_with_Notes__c = true
ORDER BY Event

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


ИЗМЕНИТЬ, чтобы отвечать на комментарии:

  1. Вы увидите EventAttendees или EventRelations в зависимости от используемой вами версии API, я думал, что мы рассмотрели это в предыдущем вопросе? Просто замените имя таблицы и имя поля соответственно.

  2. По поводу ошибки - действительно странно! Кажется, что он с радостью принимает стандартные поля пользователя, но становится глупым, когда вы начинаете использовать пользовательские. Одним из способов решения этой проблемы было бы обратиться в службу поддержки SF и подписаться на «полиморфный SOQL» (Как получить электронную почту из записи объекта задачи с помощью SOQL).

Другой способ - вам придется разделить его на 2 запроса, сначала получить идентификаторы пользователей с установленным флажком, а затем использовать их в WHERE OwnerId IN :(set of these id's here).

Это или:

SELECT Subject, Owner.UserName, Owner.Email,
    (SELECT Status, Response, RelationId, Relation.Email 
    FROM EventRelations
    WHERE RelationId IN (SELECT Id FROM User WHERE Checkbox__c = true))
FROM Event 
WHERE IsChild = false
    AND OwnerId IN (SELECT Id FROM User WHERE Checkbox__c = true)
  1. Если я правильно помню, дочерние события имеют ReccurenceActivityId набор.
person eyescream    schedule 14.06.2013
comment
Таблица EventAttendee не существует, поэтому ..FROM EventAttendee не работает. Также предыдущий запрос по какой-то причине выдает эту ошибку INVALID_FIELD: AND Owner.Sync_contacts_and_cal_with_Notes__c ^ ERROR в строке: 7: столбец: 9 Нет такого столбца «Sync_contacts_and_cal_with_Notes__c» для объекта «Имя». Если вы пытаетесь использовать настраиваемое поле, обязательно добавьте «__c» после имени настраиваемого поля. Пожалуйста, обратитесь к WSDL или вызову описания для получения соответствующих имен. - person Abhi; 14.06.2013
comment
Кроме того, я пытаюсь выяснить, как родительские и дочерние события связаны друг с другом. Еще раз спасибо за вашу помощь. - person Abhi; 14.06.2013
comment
Запрос SELECT Subject, Owner.UserName, Owner.Email, (SELECT Status, Response, RelationId, Relation.Email FROM EventRelations WHERE RelationId IN (SELECT Id FROM User WHERE Sync_contacts_and_cal_with_Notes__c = true)) FROM Event WHERE IsChild = false И OwnerId IN (SELECT Id FROM User WHERE Sync_contacts_and_cal_with_Notes__c = true) кажется правильным, но при работе с force.ide он просто зависает... извините, я относительно новичок в soql - person Abhi; 14.06.2013
comment
кажется, есть некоторые проблемы с force.ide, отлично работает с eclipse. Спасибо большое за вашу помощь. - person Abhi; 14.06.2013
comment
Используйте workbench.developerforce.com для прототипирования SOQL, Eclipse/Force.com IDE немного отстает, не всегда хорошо отображать результаты, даже если синтаксис полностью корректен. Или я большой поклонник Real Force Explorer, потому что он может подключаться ко многим средам одновременно и имеет историю SOQL, который вы запускали :) - person eyescream; 14.06.2013