Упорядочение и ограничение подзапроса в Salesforce SOQL


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

Это запрос, который я пытаюсь выполнить:

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')

Являются ли запросы order / limit недопустимыми в подзапросе SOQL?

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

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

  • 0001
  • 0125
  • 1234
  • 33456

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

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

Поэтому либо рассмотрим утверждение LIKE, либо утверждение IN, содержащее ('001234', '1234')

4 5

4 ответа:

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

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

Вот пример:

-- править --

Выберите OwnerId, владелец.Настраиваемого поля__с От случая где CaseNumber как "%1026" Заказ по CreatedDate DESC Предел 1

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

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

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

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

SELECT Name, 
    (SELECT FirstName, LastName FROM Contacts ORDER BY LastName LIMIT 10) 
FROM Account

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

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

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

SELECT 
  TYPEOF Owner
    WHEN User THEN CustomField__c
  END
FROM CASE

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

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