SQL(postgreSQL)でのクエリーの記述方法の質問です。

以下のようなテーブル構成のとき、以下の条件全てに一致する商品IDを検索するにはどうように記述するのが理想でしょうか?
条件:「価格>=10000」「登録日>'2006-07-01'」「タグ='おすすめ'」「商品名='別名1'」

□master:商品マスタテーブル
・id(商品ID)
・price(価格)
・date(登録日)

□tag:タグテーブル
・tag(タグ)
・id(商品ID)

□name:商品名テーブル
・name(商品名)
・id(商品ID)

mater.id = tag.id = name.id となっています。
入力されたデータは以下のようになっています。

■masterテーブル(フィールド id/price/date)
1/10000/2006-08-01
2/15000/2006-08-02
※商品IDはユニーク。

■tagテーブル(フィールド tag/id)
おすすめ/1
定番/1
※1つの商品IDにつき複数のタグを持ちます。

■nameテーブル(フィールド name/id)
品名1/1
別名1/1
※1つの商品IDにつき複数の商品名を持ちます。

ちなみに各テーブルの各レコード数は十数万件あります。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/08/07 15:13:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kurukuru-neko No.2

回答回数1844ベストアンサー獲得回数155

ポイント50pt

>処理もシンプルに速く動くと思ってよいのでしょうか。

いいえ

データ件数が多い場合、SQLを実行して

実際のQUERY PLANの検証が必要です。

結合の順序をかえたり、条件のしていのしかたにDBの

癖があるので実際にためしてみる必要があります。

Subqueryの方法でもよいと思いますが、

(x) and (y) and (z)

(z) and (y) and (x)

等結合の順序や、"()"の指定によっても処理

結果がかわる事があります。

実際に確認して動作速度を調べることをお勧めします。

今回だと商品名='別名1'が制約条件として

一番厳しい(一致件数が少ない)ように思えるが

実際はわからない。


確認方法は、

EXPLAN 確認したいSQL文

http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/sql...

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041203/15344...

https://www.thinkit.co.jp/free/marugoto/2/1/16/1.html

http://www2b.biglobe.ne.jp/~caco/fourth_edition/tuning.html

id:ktoshi

ありがとうございます。

データベースシステムの種類やバージョン、データベースの組み方やデータの量などはそれぞれなので、実際に試行錯誤しながらそのデータベースにあった最適なものを探すしかないのですね。

URLも参考になりました。

2006/08/03 00:42:20

その他の回答1件)

id:k6nch6n No.1

回答回数171ベストアンサー獲得回数11

ポイント20pt

select m.id from master m, tag t, name n

where m.id = n.id

and m.id = t.id

and m.price >= 10000

and m.date >= '2006-07-01'

and t.tag = 'おすすめ'

and n.name = '別名1'

where句で参照されているカラムにはindexを作成しておいた方がいいと思います。

id:ktoshi

ありがとうございます。

シンプルな記述ですね。記述がシンプルな方が、処理もシンプルに速く動くと思ってよいのでしょうか。


質問に追加:

サブクエリーの使い方が分からないので、正しく記述できてるか分かりませんが以下のような方法ってどうなのでしょうか。

select m.id from master m where m.price >= 10000 and m.date >= '2006-07-01 and m.id in (select t.id from tag t where t.tag = 'おすすめ' and t.id in (select n.id from name n where n.name = '別名1')

2006/08/02 23:31:14
id:kurukuru-neko No.2

回答回数1844ベストアンサー獲得回数155ここでベストアンサー

ポイント50pt

>処理もシンプルに速く動くと思ってよいのでしょうか。

いいえ

データ件数が多い場合、SQLを実行して

実際のQUERY PLANの検証が必要です。

結合の順序をかえたり、条件のしていのしかたにDBの

癖があるので実際にためしてみる必要があります。

Subqueryの方法でもよいと思いますが、

(x) and (y) and (z)

(z) and (y) and (x)

等結合の順序や、"()"の指定によっても処理

結果がかわる事があります。

実際に確認して動作速度を調べることをお勧めします。

今回だと商品名='別名1'が制約条件として

一番厳しい(一致件数が少ない)ように思えるが

実際はわからない。


確認方法は、

EXPLAN 確認したいSQL文

http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/sql...

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041203/15344...

https://www.thinkit.co.jp/free/marugoto/2/1/16/1.html

http://www2b.biglobe.ne.jp/~caco/fourth_edition/tuning.html

id:ktoshi

ありがとうございます。

データベースシステムの種類やバージョン、データベースの組み方やデータの量などはそれぞれなので、実際に試行錯誤しながらそのデータベースにあった最適なものを探すしかないのですね。

URLも参考になりました。

2006/08/03 00:42:20

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません