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

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

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

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


person Fenton    schedule 17.11.2011    source источник


Ответы (4)


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

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

Вот пример:

-- Редактировать --

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

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

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

person Matt K    schedule 17.11.2011
comment
Привет, Мэтью, я не думаю, что вы можете выбирать настраиваемые поля в запросе отношений, вы можете получить доступ только к общим полям, которые будут одинаковыми для разных типов владельцев. К сожалению, именно по этой причине мне пришлось перейти к подзапросу. - person Fenton; 17.11.2011
comment
Ах ты прав. OwnerId - полиморфный ключ; он может ссылаться на группу или пользователя. Это делает недоступными настраиваемые поля для пользователя. Но это дает мне другую идею. - person Matt K; 17.11.2011

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

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

SELECT Name, 
    (SELECT FirstName, LastName FROM Contacts ORDER BY LastName LIMIT 10) 
FROM Account
person Jeremy Ross    schedule 17.11.2011
comment
Идея того, что я пытаюсь сделать, имеет смысл - если есть несколько дел с одним и тем же номером дела, я хочу использовать только самый последний. - Не рассказывайте мне, почему возможно дублирование номеров дел. - person Fenton; 17.11.2011
comment
Понятно. Я не знаю, как сделать это с помощью одного запроса SOQL. - person Jeremy Ross; 17.11.2011

Я думаю, стоит добавить, что с новыми функциями 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
person Mike Ginou    schedule 23.04.2014

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

SELECT OwnerId, (select id from user)
    FROM Case 
    WHERE Case.CaseNumber LIKE '%1026' 
    ORDER BY Case.CreatedDate DESC LIMIT 1
person Adam    schedule 24.09.2012
comment
Хотя этот запрос работает, он не дает вам доступа к настраиваемым полям. - person Fenton; 25.09.2012