[Mac][iOS] NSPredicate - 1対多関連のエンティティの検索条件見本(訂正〜サブクエリーの利用)

2011年1月18日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

[前回] Cocoaの日々: [Mac][iOS] NSPredicate - 1対多関連のエンティティの検索条件見本

先日の見本が間違っていることが発覚。先日のやつはこんな指定だった。
p = [NSPredicate predicateWithFormat:
  @"ANY books.date >= %@ AND ANY books.date < %@", date1, date2]
この時の SQLはこうなる。
SELECT DISTINCT 0, t0.Z_PK FROM ZAUTHOR t0
 JOIN ZBOOK t1 ON t0.Z_PK = t1.ZAUTHOR
 JOIN ZBOOK t2 ON t0.Z_PK = t2.ZAUTHOR
 WHERE ( t1.ZDATE >= ? AND  t2.ZDATE < ?)
よくよく考えると同じテーブルではあるが、別個に結合(JOIN)しているので、WHERE句の AND 条件が意図通りに働かない。実際、テストしていて意図しないレコードがヒットするのに気がついた。これは WHERE句内の2つの条件が(元は同じだが)別のテーブル(集合)として扱われる為。 ただ先日示したように ANY(条件 AND 条件) は使えない(パースエラーになる)。この場合 SUBQUERY を使う。SUBQUERYを使って書くと先ほどの設定はこうなる。
p = [NSPredicate predicateWithFormat:
 @"SUBQUERY(books, $s, $s.date >= %@ AND $s.date < %@).@count > 0", date1, date2];
SQLはこうなる。
SELECT 0, t0.Z_PK FROM ZCUSTOMER t0
 WHERE (SELECT COUNT(*) FROM ZKARTE t1
  WHERE (t0.Z_PK = t1.ZCUSTOMER
  AND (( t1.ZTREATEDDATE >= ? AND  t1.ZTREATEDDATE < ?))) ) > ? 
これなら問題ない。実際の動作でも意図通りとなった。


参考情報


iphone - Core Data ANY BETWEEN predicate - Stack Overflow
まったく同じ問題で困っていた人がいた。

Responses

Leave a Response

人気の投稿(過去 30日間)