複数のテーブルを参照するselect文の書き方について

このQ&Aのポイント
  • データベース初心者の方に向けて、複数のテーブルを参照するSELECT文の書き方について解説します。
  • 具体的なデータ構造として、テーブル1にはデータ番号とデータ名が、テーブル2には時刻とデータ0〜3が格納されているとします。
  • この質問では、テーブル1からデータ番号を参照し、テーブル2から該当データの値を取得したい場合のSELECT文の書き方についての方法を説明します。
回答を見る
  • ベストアンサー

複数のテーブルを参照するselect文の書き方について

データベース初心者です。よろしくお願いいたします。 今、次のようなデータ構造を考えています。 テーブル1   データ番号(列1)  データ名(列2) (行1)   0     温度 (行2)   1     湿度 (行3)   2     水位 テーブル2      時刻(列1) データ0(列2) データ1(列3) データ3(列4) (行1) 10:00      27     37      50 (行2) 11:00      28     36      40 (行3) 12:00      29     36      35 (行4) 13:00      31     35      32 ここで、12:00の湿度データを参照したいとき、 まず、テーブル1から湿度のデータ番号を参照し、さらに、テーブル2から データ1の数値を取り出したいと思っています。つまり、2段階でデータを 取り出したいと思っているわけです。 例えば、12:00の湿度データは36ですが、これを1行のselect文で 書く方法がありますでしょうか? ちなみに、使おうとしているのはMySQLです。 補足が必要であればご指摘下さい。補足いたします。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

つまり、     時刻 データ名称 データ (行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システムとして保守しづらそう・・・・。

solad0313
質問者

お礼

さっそくのご回答、ありがとうございます。 はじめはご指摘のような構造を考えたのですが、実は、本当のデータは、テーブル2の列に相当するデータ種別がかなり多く、すべてのデータに時刻が付くとなると、何だかえらく無駄が多いような気がして、何かいい方法があるのではないかと思い、質問した次第です。 ご指摘にあった「DBシステムとして保守しづらそう」というのはもっともだと思いました。保守のことは考えていませんでした。もう一度、考えてみたいと思います。ありがとうございました。

その他の回答 (2)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

> すべてのデータに時刻が付くとなると、何だかえらく無駄が多いような気がして でしたら、「記録時間」テーブルのようなものを用意して、テーブル2(データテーブル)ではそのIDを記録する形にするというのはいかがでしょうか? (更新処理がちょっと面倒になりますが)

solad0313
質問者

お礼

ご回答ありがとうございます。 ご指摘の点を考慮して、 テーブルの構造を再度検討します。

noname#182251
noname#182251
回答No.2

「データ構造が不自然」は#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、値) のようなテーブル構造にするとか。 データの種別や観測システムに関する補足説明が欲しいです。

関連するQ&A

  • select文でフリーズします。

    お世話になります。 oracle11.2で とあるテーブルに select * from テーブル名(条件なし) としたらフリーズする現象が起きました。 元々のテーブル内には25万行のデータがあったため 同じ構造で違う名前のテーブル(データは1行もなし)を新規作成して 同じようにselect文をなげたところこちらもフリーズしてしまいました。 構造は約50の列があり 列数を指定して検索した場合、どちらのテーブルも結果が返ってきますが すべての列を指定しようとするとフリーズしてしまいます。 どのあたりを疑えば良いでしょうか? よろしくお願いいたします。

  • SELECT文 複数のテーブル参照について

    ASPとAccessを使用しています。 フォームから複数の値を入力させ、Access(複数のテーブル)を参照し、結果を表示させたいのですが、SELECT文でエラー表示。 初心者に毛の生えた程度しかしりませんので、教えていただきたく、お願いいたします。 以下3つのテーブルがあります。テーブルAの「検索用ID」(主キー)をテーブルB・Cの「検索用ID」にリレーションシップでつなげています。 tebleA-------------- 検索用ID 名前 備考 ----------------------- tebleB-------------- 検索用ID 地域 ----------------------- tebleC-------------- 検索用ID 職業 ----------------------- フォームで入力させるのはテーブルBの「地域」とテーブルCの「職業」 の値です。 その「地域」と「職業」からOR条件でテーブルAのデータを抽出したいのです。 SQL = "SELECT tebleA.* FROM tebleA,tebleB,tebleC WHERE tebleB.地域 = "& Request.QueryString("地域の値") &" OR tebleC.職業 = "& Request.QueryString("職業の値") &"" SQLに自信がありません・・・よろしくお願いいたします。

  • 複数テーブルにわたるCOUNT

    複数のテーブルで検索条件が当てはまった行を検索し、 その総行数を得たいのですが、 以下のSQL文ではあさっての数値が出てしまいます。 構文が間違っているのでしょうか。 (MySQLを使っています) SELECT Count(*) FROM テーブル1,テーブル2,テーブル3  WHERE (テーブル1.列1 Like 検索文字      or テーブル2.列2 Like 検索文字      or テーブル3.列2 Like 検索文字; どなたか教えてください。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Excel2007です。下記のように、テーブル1があります。

    Excel2007です。下記のように、テーブル1があります。 列0 列1 列2 列3 列4 行1  1  2   3   8 行2  3  4   6   4 行3  2  2   4   2 列0~列4は、テーブルの見出しです。(列0と書いてあるところが、A1セルです。) マクロで、行1・行2・行3のいずれかの行の列1~列3のセルを選択したいのです。 行1・行2・行3のいずれを選択するかは、動的に与えようと思います。 どのようにすれば、それができるかが質問です。 列は、構造化参照します。[列1]とか[列3]というのを使って指定したいと思います。 試しに、行を固定([行2])して、以下のコードを実行させようとしたら、エラーが出ます。 Sub Macro1() Range("A3").Select Range("テーブル1[[#This Row],[列1]:[列3]]").Select End Sub エラーは「実行時エラー'1004' 'Rangeメソッドは失敗しました:'_Global'オブジェクト」 [#This Row]というのはどのような使い方をするものなのでしょうか。

  • あるDBから別のDBのテーブルをselectしたい

    mysqlのデータベースAとBが存在するとして、 Aをuseしている状態で、Bのデータベースのテーブルをselectするには、どのような構文でSQLを実行すればよいでしょうか。

    • ベストアンサー
    • MySQL
  • SELECT文に変数を含めたい

    VisualBasic2005でMYSQLのデータベースを読み込みしたいのですが、画面で入力された番号と一致するデータを取得したいのですが、MySQLへ変数を渡すにはどうすればよろしいのでしょうか?教えてください。よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • データベースの中身をテーブルで表示したいです

    mysqlデーターベースの中身をテーブルで表示したいのですがわからない事があるので書き込みしました。 テーブルAのデーターを <TABLE> <TR><TD>mysql1行目</TD><TD>mysql2行目</TD></TR> <TR><TD>mysql2行目</TD><TD>mysql4行目</TD></TR> </TABLE> <TD></TD>の間にレコード一つ分のデータを入れて2列で表示したいです。 whileを使ってデーターを取り出すと1行にレコード一つ分のデーターを表示するのはそのままできるんですが1行にレコード二つ分のデーターを出す場合<TR>と</TR>をどういう仕組みで表示させれば良いかわかりません。 誰か教えてもらえないでしょうか?

    • 締切済み
    • PHP
  • ふたつのテーブルを参照してデータを抜き出す方法

    ふたつのテーブルを参照してデータを抜き出す方法を教えてください。ふたつのテーブルの構造は同じではありません。MySQL 4.0.2x です。 テーブル entry [ title | id | other ] sofile [ fileinfo | other | url | other ] テーブルentryからtitleおよびidフィールドのセットを全レコードからランダムに5個抽出し、 idと同じ数値をfileinfoフィールドに持つレコードのurlフィールドの値をテーブルsofileから抽出し、 titleとurlを出力、ということをさせたいです。 1個のテーブルからランダムに取り出すことはできたのですが、そのランダムの結果を受けて二つ目のテーブルからデータを取り出す方法がわかりません。ご教授いただければ幸いです。 PHPコード $ck = "SELECT * FROM entry WHERE status=2 ORDER by rand() LIMIT 5 $entry = mysql_query($ck); while ($rows = mysql_fetch_array($entry)) { echo "{$rows["title"]}\n"; echo "{$rows["id"]}\n"; }

    • ベストアンサー
    • MySQL
  • Select文を教えて下さい

    select文についてお教えください。環境はAccess2003,Win XPで動かしています。 TABLE ID(INT),STOCK(INT) 001,100 001,200 001, 002,200 002,300 002,400 003,100 上記のようなテーブル、データがあります。 ■抽出したい行 001,100 001,200 ■抽出条件 STOCKに空がはいっている。 STOCKに空がはいっている行は選択しない。 STOCKに空がはいっているIDで、同一IDでSTOCKにデータがある行を抜き出したいです。 どのようにSQLを組み立てればよいかわかりません。 宜しくお願い致します。

  • MySQL: 複数テーブルのcount

    複数テーブルの総行数(count値)を取得したいのですが、下記だとテーブルA,B,Cの結果が バラバラに出力されてしまいます。 【入力条件】 mysql> select COUNT(*) AS 列ID from テーブルA      union all      select COUNT(*) AS 列ID from テーブルB      union all      select COUNT(*) AS 列ID from テーブルC; 【出力結果】       +-----+       | 列_ID |       +-----+       |  1  | ←テーブルAの合計:行数       |  2  | ←テーブルBの合計:行数       |  3  | ←テーブルCの合計:行数       +-----+ 総行数:6を一発で取得するには、どのようにしたらよろしいのでしょうか? 大変恐縮ですが、ご教授よろしくお願いいたいます。 <<MySQLのverは5,5です。

    • ベストアンサー
    • MySQL