kanou****@nttda*****
kanou****@nttda*****
2007年 12月 13日 (木) 18:24:39 JST
加納です。下記は間違いですね。 > select * from > (select * from table1 where data @@ 'test') AS t1, > (select * from table2 where data @@ 'test') AS t2 > WHERE t1.id = t2.id; これだと、「検索対象が"件名かつ本文"の場合」になります。 検索対象が"件名又は本文"の場合ということですから、 > > SELECT * FROM table1,table2 > > WHERE > > table1.id = table2.id AND > > (table1.data @@ 'TEST' or table2.data @@ 'TEST') 少なくとも論理的にはこれで正しいと思います。あとはプラ ンがどうかですが。 で、幸坂くんのアイデアを利活用すると、と思ったのですが、 複雑怪奇になりますね。 select * from (select * from table1 where data @@ 'test') AS t1 INNER JOIN table2 AS t2 ON t1.id = t2.id UNION select * from (select * from table2 where data @@ 'test') AS t2 INNER JOIN Table1 AS t1 ON t1.id = t2.id; だといかがでしょう?論理的には合ってます。たぶん・・・ 2回アクセスすることになるので、効率的とは言えませんが、 強制的に全文検索インデックスを使えていると思います。 蛇足ですが、旧形式の結合は、OUTER JOINを使用する際に 大幅に書き換えなければいけないため、JOIN演算子を使用 されることをお勧めします。旧形式でOUTER JOINを使おう とすると、Oracle方言に引っかかったりマルチプラット フォームでの弊害も多いです。 実は、FULL OUTER JOINでうまくいくかと思ったのですが、 うまくいかないことに気がつきました。そのため、JOIN演 算子を残しています。 FULL OUTER JOIN については、下記を参照ください。 http://www.postgresql.jp/document/pg825doc/html/queries-table-expressions.ht ml#QUERIES-FROM