在Salesforce SOQL中排序和限制子查询

时间:2011-11-17 10:04:43

标签: 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 BYLIMIT,则可以使用

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的{​​{1}}语句

4 个答案:

答案 0 :(得分:1)

我找不到任何文档,指出LIMIT和/或ORDER BY不适用于子查询,但我遇到了您提到的相同错误。

但是,可以从 Case 对象开始,然后查看 User ,类似于SOQL中的Lookup Relationships和Outer Joins部分{{3 }}。我不确定这对你是否有用,但你可能想尝试一下。

以下是一个例子:

- 编辑 -

<击>     SELECT OwnerId,Owner.CustomField__c     FROM Case WHERE     CaseNumber LIKE'%1026'     ORDER BY CreatedDate DESC     限制1

原来不能访问自定义字段,因为OwnerId是引用用户的多态键。 这意味着以上内容无效,抱歉。

要解决这个问题非常复杂。您必须创建一个名为“用户所有者”的自定义查找字段,或者其他内容。如果所有者是用户,这将存储对用户的查找引用(可以通过将OwnerId的开头与'005'进行比较来检查,用户ID前缀)。在更新触发器之后,需要使用后插入来填充该字段。此新字段的所有值都需要为以前存在的 Cases 进行数据加载。但是,一旦您拥有了这个新的“用户所有者”字段,您就可以通过SOQL访问User上的自定义字段,并使用它。

答案 1 :(得分:1)

ORDER BYLIMIT在子查询中没有意义,因为您没有从子查询返回记录。相反,子查询只是构建一个用于过滤主查询的ID列表。

如果以返回子查询记录的方式使用子查询,则这些子句可以正常使用。例如,这有效:

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

答案 2 :(得分:1)

我认为值得补充的是,在首次询问和回答此问题时,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

答案 3 :(得分:0)

您是否尝试将查询切换为类似的内容?

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