• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL(初心者です) 3つのテーブルを結合)

SQLで3つのテーブルを結合する方法

このQ&Aのポイント
  • SQL初心者の方が3つのテーブルを結合する方法について質問されています。具体的な条件として、品種機械テーブルから使用日付が最大の行データを取得し、その品種と一致する行データを品種テーブル、機械テーブルからそれぞれ取得する方法を教えて欲しいとのことです。
  • 質問者はうまい方法が思いつかないため、アドバイスや参考になりそうなホームページなどを教えてほしいとも述べています。
  • 上記の質問文章はSQLの初心者が3つのテーブルを結合する方法についての質問です。具体的な条件としては、品種機械テーブルから使用日付が最大の行データを取得し、その品種と一致する行データを品種テーブル、機械テーブルからそれぞれ取得する方法を知りたいとのことです。また、質問者はうまい方法が思いつかないため、アドバイスや参考になりそうなホームページなどを教えてほしいとも述べています。

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.3

#1の bonaronです。 仕様を誤解してました。 それも、途中のクエリをアップしてしまった(^^; >3.機械テーブルを読み込む >2で取得した機械と一致する行データをすべて取得 ということで、(1)品種テーブルには、マシンのフィールドがあるのでしょうか? 品種 マシン・・・ A  1 A  2 ・  ・ A  9 B  21 ・  ・ のように。 仕様の確認ですが 1.(3)のテーブルから[使用日付]の   最大値 "20051204"を取得。 2.(3)のテーブルから"20051204" の品種(A,B,D等)を取得。 3.品種テーブルから、2の A,B,D のデータを取得。   上の品種テーブルの例ではA-1~A-9、B-21~・・。 4.機械テーブルから、3の 1,2,・・・9,21・・・を取得。   最終的に必要なのは、このデータのみ。 上記仕様のクエリです。 SELECT * FROM 機械テーブル INNER JOIN [SELECT マシン FROM 品種テーブル WHERE 品種 In (SELECT DISTINCT 品種 FROM 品種機械テーブル WHERE 使用日付=DMax("使用日付","品種機械テーブル"););]. AS Q品種 ON 機械テーブル.マシン = Q品種.マシン ORDER BY 機械テーブル.マシン; #2回答者さんへ >#1回答者さんが使用している「TOP」は、SQL SERVERだけの機能だと思います。 Accessにも、もちろん「TOP」は存在します。 クエリのプロパティの「トップ値」です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

#3の補足です。 品種A、品種Bに同じマシンがある場合2つ抽出されます。 1つだけにするには、 [SELECT マシン FROM 品種テーブル  を [SELECT DISTINCT マシン FROM 品種テーブル  にします。

nishimu
質問者

お礼

参考にさせて作業させてもらいます。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

>品種でユニークしますが使用日付を降順にならべ変え ます。 >品種機械テーブルから使用日付がMAXのものの行データをすべて取得 「品種でユニークします」とは、どういう意味ですか? (3)のデータでは、品種は重複していますが? 使用日付のMAX値のデータだけが必要なのに、「降順に並べ替える」という無駄な操作を行いたい理由は? #1回答者さんが使用している「TOP」は、SQL SERVERだけの機能だと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

SELECT TOP 1 品種機械.*, 品種.*, 機械.* FROM (品種機械 INNER JOIN 品種 ON 品種機械.品種 = 品種.品種) INNER JOIN 機械 ON 品種機械.マシン = 機械.マシン ORDER BY 品種機械.使用日付 DESC; 品種,マシンは 2度表示されますが、 それは、偉業目の「*」を個々のフィールド名にすることで、 回避できます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テーブル結合のSQL文について

    はじめまして、よろしくお願いします。 テーブルA、B、Cから情報を取得し、下記のSELECTイメージを表示させたいのですが、 どのようなSQLを記述すれば良いのかわからず、困っております。 どなたかご教示頂けますでしょうか。 SELECTイメージ  日付      キー  ------------ -------------  9/1      AAAAA  9/1      CCCCC  9/2      AAAAA  9/2      CCCCC  9/3      AAAAA  9/3      BBBBB  9/3      CCCCC  9/4      AAAAA  9/4      BBBBB  9/4      CCCCC テーブルA  日付      キー  ------------- -------------  8/31      AAAAA  8/31      CCCCC テーブルB  日付      キー  ------------ -------------  9/1      AAAAA  9/3      BBBBB  9/4      CCCCC テーブルC  日付  -------------   ・   ・   ・   8/31   9/1   9/2   9/3   9/4   9/5   9/6   ・   ・   ・

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • SQL SEREVER で選択した固定値との結合について質問です。

    SQL SEREVER で選択した固定値との結合について質問です。 日付と紐付けたデータを1ヶ月分出力するSQLを作成しています。 紐付け対象となるデータに、1ヶ月毎日のデータが存在するわけではありません。 そこで、固定値として2010年7月であれば、 2010-07-01~2010-07-31 までの日付を全て固定値として取得 (対象データは行で取得したいのでUnionで繋いでいく)して、 その日付と紐づく対象データを外部結合しようと考えました。 SqlServerの場合、固定値のみを取得した場合 ダミーテーブルを使用するということができないようなので、 取得した固定値との紐付け時に下記???のところの指定がわかりません。 Select '2010-07-01' 日付 Left Join 結合対象テーブル On 結合対象テーブル.日付 = ???.日付 他のやり方で実現可能なのかもしれませんが、調べてもわかりませんでした お解りになる方いらっしゃいましたら、教えていただければと思います。

  • SQL 重複しないJoinの仕方を教えてください

    データが重複しないSQL文の書き方を教えてください。 下記のような2つのテーブルがあり、「管理番号」でOnして「使用数」をJoinさせ、かつ重複しないようにSQLを作成したいのですが、MySQLで可能でしょうか? ※0002に関しては、テーブル2の方がデータ数が多いため、Join後は2行になって「使用数」は重複せず、「数」の部分には0が入ればベストです 【テーブル1】 日付    品番  管理番号 数 2012/6/12 A987  0001 500 2012/6/14 A987  0001 300 2012/6/16 A987  0001 400 2012/6/18 A987  0001 800 2012/6/12 A987  0002 750 2012/6/12 A987  0003 540 2012/6/14 A987  0003 740 2012/6/16 A987  0003 840 2012/6/18 A987  0003 240 2012/6/20 A987  0003 640 【テーブル2】 日付    品番  管理番号 使用数 2012/7/10 A987  0001 160 2012/7/11 A987  0001 260 2012/7/10 A987  0002 220 2012/7/12 A987  0002 320 2012/7/20 A987  0003 530 2012/7/22 A987  0003 430 2012/7/24 A987  0003 830 【テーブルJoin】 日付    品番  管理番号 数 使用数 2012/6/12 A987  0001 500 160 2012/6/14 A987  0001 300 260 2012/6/16 A987  0001 400 0 2012/6/18 A987  0001 800 0 2012/6/12 A987  0002 750 220 2012/6/12 A987  0002 0 320 2012/6/12 A987  0003 540 530 2012/6/14 A987  0003 740 430 2012/6/16 A987  0003 840 830 2012/6/18 A987  0003 240 0 2012/6/20 A987  0003 640 0

  • 2つのテーブルを結合してデータ抽出時に

    2つのテーブルからデータを取得したいです。 結合し、データの取得を試みてますが、キーに対して空白の行が取得できません。どうしたらよいでしょうか?助けてください。 Aテーブル   Bテーブル 1 100 A       1 みかん 2 150 B       2 りんご 4 200 D       3 すいか 5 300 E       4 なし 6 500 F       6 高級なし 上記のようなテーブルをくっつける時の話で求める値は以下なんですが… Cテーブル 1  100  A  みかん 2  150  B  りんご 3       すいか 4  200  D  なし 5  300  E 6  500  F  高級なし どちらかがデータなしでもキー(例の場合は1とかの数字です)があるもの は表示したいです。 どなたかわかるかた教えてください。お願いします。 ちなみに使用しているのはoracleです。

  • 結合したテーブルの特定カラムのカウントについて

    PHPを学習しており、MySQLでデータベースにPDOで接続をしています。 添付画像のようなチームのデータを管理するテーブル(teamテーブル)と メンバーのデータを管理するテーブル(memberテーブル)があり、 teamテーブルのkeywordカラムを検索条件にし、 keywordカラムの値が『keyword1』と一致するteamテーブルのレコードの teamcodeカラムの値と一致する値を持つ memberテーブルのレコード数をカウントして teamテーブルから『teamcode』、『teamname』、『teamkana』、『date』を取得し、memberテーブルでの『teamcode』の該当数を取得したいです。 OUTER JOINして、NULLIFやCOALESCEなどを使用して試してみたのですが、 構文の使い方が悪いのか、そもそも使うべきSQL文が違うのかわかりませんが、 添付画像の『teamcode』の値が『0004』のもののように memberテーブルに該当する値が存在しないものは NULLになってしまい、取得ができませんでした。 できればmemberテーブルに該当する値が存在しない場合は「0」として取得したいです。 このような場合、どのようなSQL文を記述したら良いのでしょうか? 少しややこしい内容ですので、説明が不足していたり、 説明が分かりづらいようであれば補足します。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • メインデータと最新サブデータのテーブル結合について

    お世話になっております。 MySQL4.1にて以下のようなデータを取得したいと考えています。 1回のSQLで何とかとりたいと考えているのですが、 良いお知恵はないでしょうか? ▼Aテーブル ID(PK) メインメモ ▼Bテーブル ID(PK) 日付(PK) サブメモ ▼取得したい結果 ID(1) メインメモ 最新サブメモ ID(2) メインメモ 最新サブメモ ID(3) メインメモ null ・「メインメモ」と「サブメモ」は1対多の状態です。 ・IDごとに1行だけメインメモと最新のサブメモを取得したい。 ・サブメモがなくてもメインメモだけでも取れる。  (Aテーブル LEFT OUTER JOIN Bテーブルの関係) 上記の条件でデータを取得したいと考えております。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • SQL Server テーブル設計で悩んでいます。

    SQL Server 2008 R2 Visual Studio 2008 テーブルの設計で悩んでいます。 テーブルAのようなデータがあり、実際には、場所のNo.の数は500点くらいあります。 このデータをSQL to LINQでデータの追加、参照をしたいと思っています。 テーブルA,B、どちらの形式で設計する方がよいのでしょうか。 テーブルAの場合は、見た目がそのままで分かりやすいのですが、データ追加時(INSERT)に多数のデータを 追加する方法が分かりません。 テーブルBの場合は、テーブルAの形式で取得する場合、どうすればよいのか分かりません。 ここから先に進めず困っております。よろしくお願いします。 テーブルA 日付 No.1 No.2 No.3 No.4 No.5 2011/1/1 0 68 37 41 38 2011/1/2 3 60 3 69 46 2011/1/3 22 89 63 14 77 2011/1/4 75 8 55 46 41 2011/1/5 63 92 1 26 90 2011/1/6 61 23 77 42 93 2011/1/7 54 52 36 44 41 2011/1/8 72 98 30 66 48 2011/1/9 20 3 89 15 59 テーブルB 日付 場所 線量 2011/1/1 No.1 0 2011/1/1 No.2 68 2011/1/1 No.3 37 2011/1/1 No.4 41 2011/1/1 No.5 38 2011/1/2 No.1 3 2011/1/2 No.2 60 2011/1/2 No.3 3 2011/1/2 No.4 69 2011/1/2 No.5 46

  • 二つのSQLサーバーのテーブルからビューを作成するには

    わけあってAサーバーとBサーバーに同じ項目構成の、同じ名前のテーブルがあります。只入っているデータが異なってます。 Aサーバーの"H"テーブルには 3行のデータがあります。   Bサーバーの"H"テーブルには2行のデータがあります。    ちなみにリンクサーバーはセットアップしてあり、二つのサーバーの間のセキュリティは確立してあります。 以上のような場合、ビューで二つの"H"テーブルのすべての行を表示できますか? 結合ではなく、AサーバーのテーブルのデータにBサーバーのテーブルのデータを追加した感じのビューを作りたいです。 どなたか知っている方がいましたら、教えてください。

このQ&Aのポイント
  • Labia Gシリーズのソフトウェアが必要な場合、現在使用しているLAVIE NS150/Gで設定ソフトをダウンロードして利用する方法を知りたいです。
  • PC-GL235UYARを使用していましたが、電源が入らなくなり、現在はLAVIE NS150/Gを使用しています。wirelessTVデジタルのチューナーは残っていますが、NS150/Gで利用するための設定ソフトをダウンロードすることは可能でしょうか。
  • Labia Gシリーズのソフトウェアについて質問です。以前使用していたPC-GL235UYARは壊れてしまいましたが、現在はLAVIE NS150/Gを使用しています。wirelessTVデジタルのチューナーが残っていますが、NS150/Gで利用するための設定ソフトをダウンロードできるのでしょうか。有料の場合も構いません。
回答を見る