- ベストアンサー
複数のテーブルを参照するselect文の書き方について
- データベース初心者の方に向けて、複数のテーブルを参照するSELECT文の書き方について解説します。
- 具体的なデータ構造として、テーブル1にはデータ番号とデータ名が、テーブル2には時刻とデータ0〜3が格納されているとします。
- この質問では、テーブル1からデータ番号を参照し、テーブル2から該当データの値を取得したい場合のSELECT文の書き方についての方法を説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
つまり、 時刻 データ名称 データ (行1)12:00 湿度 36 というような結果が返ってくる風にしたいのですね? この目的だとテーブル構造の方が適してないと思うな。個人的には。テーブル2の方をこう変えたい。 テーブル2’ 時刻 データ番号 データ (行1)10:00 0 27 (行2)10:00 1 37 (行3)10:00 2 50 ・ ・ ・ (行n)12:00 1 36 ・ ・ ・ (行z)13:00 2 32 この構造だと、 select 2'.時刻, 1.データ名称, 2'.データ from 1, 2' where 1.データ番号=2'.データ番号 and 2'.時刻=12:00 と一発だ。どうしてもあれなら、 select 2.時刻, 1.データ名称, 2.データ1 from 1, 2 where 1.データ番号=1 and 2.時刻=12:00 とすれば出てくるかも知れない(未検証)が、select句の中を動的に作成しなければならないなど、DBシステムとして保守しづらそう・・・・。
その他の回答 (2)
- DexMachina
- ベストアンサー率73% (1287/1744)
> すべてのデータに時刻が付くとなると、何だかえらく無駄が多いような気がして でしたら、「記録時間」テーブルのようなものを用意して、テーブル2(データテーブル)ではそのIDを記録する形にするというのはいかがでしょうか? (更新処理がちょっと面倒になりますが)
お礼
ご回答ありがとうございます。 ご指摘の点を考慮して、 テーブルの構造を再度検討します。
「データ構造が不自然」は#1の回答と同様、第一感です。 たとえば テーブル 時刻 温度 湿度 水位 (行1) 10:00 27 37 50 (行2) 11:00 28 36 40 (行3) 12:00 29 36 35 (行4) 13:00 31 35 32 では拙いのでしょうか。あるいはデータ種別が多く、一回の観測でその一部しか観測しないのであれば 1.観測種別マスタ 2.観測記録(観測日時、観測者、etc.) 3.観測値(観測種別ID、観測記録ID、値) のようなテーブル構造にするとか。 データの種別や観測システムに関する補足説明が欲しいです。
お礼
さっそくのご回答、ありがとうございます。 はじめはご指摘のような構造を考えたのですが、実は、本当のデータは、テーブル2の列に相当するデータ種別がかなり多く、すべてのデータに時刻が付くとなると、何だかえらく無駄が多いような気がして、何かいい方法があるのではないかと思い、質問した次第です。 ご指摘にあった「DBシステムとして保守しづらそう」というのはもっともだと思いました。保守のことは考えていませんでした。もう一度、考えてみたいと思います。ありがとうございました。