2

我正在尝试解决仅删除与两个条件匹配的行的问题,每个条件都是一个 id 列表。现在这些 Id 是成对出现的,如果要删除的项目有一个,那么它必须有第二个,所以只使用两个 in 子句是行不通的。我想出了两个解决方案。

1)使用两个 in 子句,然后遍历项目并检查有问题的两个 id 是否出现在正确的配对中。

IE

for(Object__c obj : [SELECT Id FROM Object__c WHERE Relation1__c in :idlist1 AND Relation2__c in:idlist2]){
    if(preConstructedPairingsAsString.contains(''+obj.Relation1__c+obj.Relation2__c)){
        listToDelete.add(obj);
    }
}

2)遍历 id 并构建一个公认的长查询。

我喜欢第二个选择,因为我只得到我需要的项目,并且可以将列表放入删除,但我知道 salesforce 与 SOQL 查询挂断。第二个选项有惩罚吗?构建和查询长字符串或获取比必要更多的对象并过滤更好?

4

1 回答 1

5

通常,您希望将尽可能多的逻辑放入 soql 查询中,因为这不会使用任何脚本语句,并且它们的执行速度比您的代码快。但是,soql 查询有 10k 个字符的限制(可以提高到 20k),因此根据我的信封背面计算,在达到该限制之前,您只能输入 250 个左右的 id 对。

我会选择选项 1,或者如果您真的关心效率,您可以在对象上创建一个公式字段,将 id 配对并对其进行过滤。

formula: relation1__c + '-' + relation2__c

for(list<Object__c> objs : [SELECT Id FROM Object__c WHERE formula__c in :idpairs]){
    delete objs;
}
于 2012-07-23T14:36:04.330 回答