[Ludia-users 150] Re: 複数のテーブルに対する全文検索について

Back to archive index

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




Ludia-users メーリングリストの案内
Back to archive index