Порядок и ограничение подзапроса в Salesforce SOQL - PullRequest
6 голосов
/ 17 ноября 2011

Я пытаюсь получить владельца дела на основе частичного совпадения, где мы выбираем самый последний случай, который соответствует частичному совпадению.

Я пытаюсь выполнить запрос:

SELECT User.CustomField__c 
FROM User 
WHERE User.Id IN (
    SELECT OwnerId 
    FROM Case 
    WHERE Case.CaseNumber LIKE '%1026' 
    ORDER BY Case.CreatedDate DESC LIMIT 1)

Следующий запрос работает сам по себе, но не выглядит счастливым как часть подзапроса:

SELECT OwnerId 
FROM Case 
WHERE Case.CaseNumber LIKE '%1026' 
ORDER BY Case.CreatedDate DESC LIMIT 1

Точно так же, если я опускаю ORDER BY и LIMIT, это работает:

SELECT User.NVMContactWorld__NVM_Agent_Id__c 
FROM User 
WHERE User.Id IN (
    SELECT OwnerId FROM Case 
    WHERE Case.CaseNumber LIKE '%1026')

Запрещены ли запросы порядка / лимита в подзапросе SOQL?

Просто чтобы прояснить этот вопрос, сценарий, с которым я имею дело, выглядит следующим образом ...

Организация Salesforce может настроить «формат отображения» для номеров дел. Если они выберут «4» цифры, вы получите номера дел, такие как:

  • 0001
  • 0125
  • 1234
  • 33456

Можно перенастроить номера ваших дел для получения следующих номеров дел , а также номеров дел выше ...

  • 000001
  • 001234
  • 033456

Я не хотел, чтобы люди были сбиты с толку заявлением LIKE, проблема в том, что 001234 и 1234 - это разные случаи, поэтому, если клиент поставляет 1234, и я нахожу две записи, я хочу начать с предположения, что они самый последний случай.

Итак, рассмотрим оператор LIKE или оператор IN, содержащий ('001234', '1234')

Ответы [ 4 ]

1 голос
/ 23 апреля 2014

Я думаю, что стоит добавить, что с новыми функциями SOQL, которые были недоступны, когда этот вопрос впервые был задан и получен ответ, теперь подход к запросу из Case должен быть жизнеспособным (с доступом к настраиваемым полям).

В частности, функция TYPEOF обеспечивает доступ к конкретным типам полей с помощью полиморфных поисков: http://www.salesforce.com/us/developer/docs/soql_sosl/Content/sforce_api_calls_soql_select_typeof.htm

Стоит отметить, что эта функция все еще находится в Preview для разработчиков.

SELECT 
  TYPEOF Owner
    WHEN User THEN CustomField__c
  END
FROM CASE
1 голос
/ 17 ноября 2011

ORDER BY и LIMIT не имеют смысла в вашем подзапросе, потому что вы не возвращаете записи из подзапроса. Вместо этого подзапрос просто строит список идентификаторов, используемых для фильтрации основного запроса.

Если вы используете подзапрос так, чтобы возвращались записи подзапроса, эти условия подойдут. Например, это работает:

SELECT Name, 
    (SELECT FirstName, LastName FROM Contacts ORDER BY LastName LIMIT 10) 
FROM Account
1 голос
/ 17 ноября 2011

Нет документации, в которой указано, что LIMIT и / или ORDER BY не работают с подзапросами, но я столкнулся с той же ошибкой, о которой вы упомянули.

Однако она может работать дляначните с объекта Case и найдите User , аналогично разделу "Отношения поиска и внешние соединения" в документации SOQL .Я не уверен, что это сработает для вас, но вы можете попробовать это.

Вот пример:

- Правка -

SELECT OwnerId, Owner.CustomField__c ОТ Case WHERE CaseNumber LIKE '% 1026' ORDER BY CreatedDate DESC LIMIT 1

Оказывается, пользовательские поля недоступны, поскольку OwnerId - это полиморфный ключ, ссылающийся на Group или Пользователь . Это означает, что вышеописанное не будет работать , извините.

Обойти это очень сложно.Вам нужно будет создать настраиваемое поле поиска с именем «Владелец пользователя» или что-то в этом роде.Это будет хранить справочную информацию для пользователя , если владельцем является пользователь (это можно проверить, сравнив начало OwnerId с '005', префиксом идентификатора пользователя).Это поле должно быть заполнено с помощью после вставки, после обновления Trigger.Все значения для этого нового поля должны быть загружены данными для ранее существующих Cases .Но как только у вас появится это новое поле «Владелец пользователя», вы сможете использовать пользовательские поля для пользователя через SOQL, используя его.

0 голосов
/ 24 сентября 2012

Вы пытались переключить свой запрос на что-то вроде этого?

SELECT OwnerId, (select id from user)
    FROM Case 
    WHERE Case.CaseNumber LIKE '%1026' 
    ORDER BY Case.CreatedDate DESC LIMIT 1
...