function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ruparuparuparupa 

SOQLでオブジェクトのListをバインド変数として使いたい

お世話になっております。

SOQLでオブジェクトのListをバインド変数として使いたいのですが、可能でしょうか。

参考サイト
http://blog.flect.co.jp/salesforce/2011/11/soql-a233.html

上記サイトにて、
// Listの場合
List<String> nameList = new List<String>();
nameList.add('佐藤');
nameList.add('木村');
 
List<Contact> ctcList
  = [Select Id From Contact Where LastName IN :nameList];
とありますが、
// List<Contact>の場合
List<Contact> conList = new List<Contact>();
conList = [Select Id,AccountId From Contact];
 
List<Account> accList
  = [Select Id From Account Where Id = :conList.AccountId ];  //←コンパイルエラー
上記のように、List<Contact>をバインド変数として使うイメージです。
※for文内でSOQLを使わない形で実装したいです。

ご存知の方がいらっしゃいましたら、ご教授をどうぞ宜しくお願い致します。
Best Answer chosen by ruparupa
Taiki YoshikawaTaiki Yoshikawa
そうですね、そういう条件の指定はざんねんながらできないです。
一度3項目分のリストを用意してOR条件などで取得した後、ループ処理内で一致する項目を判定という形になると思います。

もしくは、3項目分の値を連結した数式を用意してWHEREの判定で使用するという方法も可能だと思います。

All Answers

Taiki YoshikawaTaiki Yoshikawa
一度List<String>型にセットする必要があると思います。
List<String> accountIds = new List<String>();
for (Contact c : conList) {
    accountIds.add(c.AccountId);
}

List<Account> accList = [Select Id From Account Where Id IN :accountIds ];

AccountIdはID型なので、List<Id>の方がいいかもしれません。
 
ruparuparuparupa
Taikiさん

ご教授まことにありがとうございます。
SOQLでオブジェクトのリストをバインドするようなことはやはりできないですよね。

オブジェクト間で、1,2項目が一致するものを取得したい場合はListやMapを使用してfor文で回せば良いかなと思っていたのですが、
例えばオブジェクト間で3項目以上一致するものを指定したいときに、オブジェクトのList型のようなものを使えないのかな、
と疑問に思ったところでした。

具体的な例を挙げますと、
カスタムオブジェクトAobj__cとBobj__cがあり、
それぞれA1__c、A2__c、A3__c、B1__c、B2__c、B3__cという項目がある場合に、
List<Aobj__c> aList = new List<Aobj__c>();
aList = [Select A1__c, A2__c, A3__c From Aobj__c];
 
List<Bobj__c> bList
  = [Select B1__c, B2__c, B3__c From Bobj__c 
		Where B1__c = :aList.A1__c
		AND   B2__c = :aList.A2__c
		AND   B3__c = :aList.A3__c
		];
といったイメージです。

3項目以上比較したいときは3回以上ループを回す。。もしくはfor文内でSELECTするしかないですよね。
Taiki YoshikawaTaiki Yoshikawa
そうですね、そういう条件の指定はざんねんながらできないです。
一度3項目分のリストを用意してOR条件などで取得した後、ループ処理内で一致する項目を判定という形になると思います。

もしくは、3項目分の値を連結した数式を用意してWHEREの判定で使用するという方法も可能だと思います。
This was selected as the best answer
ruparuparuparupa
Taikiさん

ありがとうございました!!