2

それぞれがIDのリストである2つの基準に一致する行のみを削除する問題を解決しようとしています。これで、これらのIDはペアになります。削除するアイテムに1つある場合は、ペアの2番目のIDが必要であるため、2つのin句を使用するだけでは機能しません。私は2つの解決策を考え出しました。

1) 2つのin句を使用しますが、アイテムをループして、問題の2つの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をループして、明らかに長いクエリを作成します。

必要なアイテムだけを取得し、リストを削除するだけでよいので、2番目の選択肢が好きですが、salesforceがSOQLクエリでハングアップしていることはわかっています。2番目のオプションにペナルティはありますか?長い文字列を作成してクエリを実行するのが良いですか、それとも必要以上のオブジェクトを取得してフィルタリングするのが良いですか?

4

1 に答える 1

5

一般に、soqlクエリにはできるだけ多くのロジックを配置する必要があります。これは、スクリプトステートメントを使用せず、コードよりも高速に実行されるためです。ただし、soqlクエリには10k文字の制限があり(20kに上げることができます)、エンベロープ計算の裏側に基づくと、その制限に達する前に250idペア程度しか入れることができません。

オプション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 に答える