SQL使用時の外部結合とMAX関数の使い方

このQ&Aのポイント
  • SQL文を使用する際に、外部結合とMAX関数を組み合わせる方法を教えてください。
  • 具体的には、2つのテーブルを使用して、TABLE1のNAMEとTABLE2のNAMEが関連付くデータを取得する一連の手順を解説してください。
  • さらに、TABLE2のPRICEが大きい方を取得する方法も教えてください。
回答を見る
  • ベストアンサー

SQLを教えて下さい

SQL文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)

  • Oracle
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • xKENx
  • ベストアンサー率65% (21/32)
回答No.1

こんな感じでいかがでしょうか。 SELECT   TABLE1.NAME  ,TABLE2_V.NAME  ,TABLE1.PRICE  ,TABLE2_V.PRICE FROM TABLE1,  (SELECT * FROM TABLE2   WHERE ROWID IN (   SELECT MIN(ROWID) FROM TABLE2    WHERE (ID,PRICE) IN (SELECT ID, MAX(PRICE) FROM TABLE2 GROUP BY ID)   GROUP BY ID   )  ) TABLE2_V WHERE TABLE1.ID = TABLE2_V.ID(+)

関連するQ&A

  • SQLで・・

    すみません、教えてください。 次のようなデータがあります。 table_A Name1 Name2 ----------- 1   2 3   4 table_B ID    Name --------------- 1     あ 2     い 3     う 4     え 次のような検索結果が欲しいとします。 Name1 Name2 ------------- あ    い う    え この結果を導くSELECT文はどう書けばいいでしょうか? 今、 select B.Name as Name1, C.Name as Name2 from table_A A, table_B B, table_B C where A.Name1=B.ID AND A.Name2=C.ID とやってみましたが、検索結果は0件になってしまいます。 お知恵をお貸しください!

  • PostgresSQL のSQL文について(SELECT)

    PostgresであるSelect文がわかりません。 以下のテーブルより *KOUMOKU*[テーブル名] SUB1|SUB2|SUB3|SUB4|SUB5|ID_NAME A01 | | | | |大項目1 A01 |B01 | | | |大項目2 A01 |B01 |C01 | | |大項目3 A01 |B01 |C01 |D01 | |大項目4 大項目1~大項目4の値(ID_NAME)を一気に取得する SELECT文がわかりません。 よろしくお願いいたします。

  • PostgresSQL のSQL文について(SELECT) :2

    テーブル図があまりにもずれているため投稿しなおします。 PostgresであるSelect文がわかりません。 以下のテーブルより *KOUMOKU*[テーブル名] SUB1|SUB2|SUB3|SUB4|SUB5|ID_NAME A01  |    |    |    |   |大項目1 A01  |B01  |    |    |   |大項目2 A01  |B01  |C01  |    |   |大項目3 A01  |B01  |C01  |D01  |   |大項目4 大項目1~大項目4の値(ID_NAME)を一気に取得する SELECT文がわかりません。 「大項目1 大項目2 大項目3 大項目4」という検索結果を得たいです。 よろしくお願いいたします。

  • COBOLの動的SQLについて

    COBOLにおいて、動的にSQLを組みたいのですが、 取得する方法も含めてご教授願いませんでしょうか? 例) 条件により コード=1の場合、 SELECT A.ID,B.NAME FROM ID A,NAME B コード=2の場合、 SELECT A.ID,B.NAME,C.ADDRESS FROM ID A,NAME B,ADDRESS C のように条件により取得する項目も数もテーブルも違います。 この場合でのSQLの組み方とデータを取得する(FETCHの方法)がわかりません。 また、取得する件数も1件ではありません。 よろしくお願い致します。

  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • SQL HAVING句の使い方について

    以下のテーブルAとテーブルBを結合して結果テーブルを出力したいと考えています。 (テーブルA上のIDのカウントした数をテーブルBに結合して出力したい。) テーブルA ----------- CATE ID aaa 001 bbb 001 ccc 003 ddd 004 テーブルB ----------- ID NAME 001 101 002 102 003 103 004 104 結果テーブル ---------------------- ID NAME COUNT 001 101 2 002 102 0 003 103 1 004 104 1 そこで、 =================================== SELECT B.ID, B.NAME, COUNT(A.ID) FROM TABLE_A B, TABLE_B B GROUP BY B.ID, B.NAME, A.ID HAVING A.ID = B.ID =================================== とSQLを書いてみましたが、 002 102 0 のテーブルAにIDが存在していない列が結果として表示されませんでした。 WHERE句でいう「WHERE A.ID =* B.ID」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。

  • SQLでのレコード更新、追加処理

    Windows7 32bit MySQL5.5を使用しています。 テーブルのスペースが崩れてしまっていて見づらいかと思いますが よろしくお願いします。 ・table B +------+------------------+------+ | id | name | id_A | +------+------------------+------+ | 1 | 手順書作成 | 1 | | 2 | レビュー | 1 | | 3 | 開発 | 2 | | 4 | 社内・社外研修 | 3 | +------+------------------+------+ (id=主キー、name=文字列、id_A=テーブルAを参照するための外部キー) ↓ 1回だけ以下のプログラムを実行し、table Cを生成します create table C (SELECT * FROM B); alter table C add flag Boolean default FALSE; ↓ ・table C +------+------------------+------+------+ | id | name | id_A | flag | +------+------------------+------+------+ | 1 | 手順書作成 | 1 | 0 | | 2 | レビュー | 1 | 0 | | 3 | 開発 | 2 | 0 | | 4 | 社内・社外研修 | 3 | 0 | +------+------------------+------+------+ その後、Bが不定期に更新されるため、どこかの タイミングで、同様にCにも更新情報を反映したいのです。 ↓ ・更新されたtable B +------+------------------+------+ | id | name | id_A | +------+------------------+------+ | 1 | 手順書作成 | 1 | | 2 | レビュー | 1 | | 3 | 開発 | 2 | | 4 | 社内研修 | 3 | | 5 | 社外研修 | 3 | +------+------------------+------+ ↓ ・table C +------+------------------+------+------+ | id | name | id_A | flag | +------+------------------+------+------+ | 1 | 手順書作成 | 1 | 1 | | 2 | レビュー | 1 | 0 | | 3 | 開発 | 2 | 0 | | 4 | 社内研修 | 3 | 1 | ←このレコードは更新したい | 5 | 社外研修 | 3 | 0 | ←このレコードは追加したい +------+------------------+------+------+ どのように指定をすればいいでしょうか。 思いつくのは create table temp( select B.id, B.name, B.id, C.flag from B left join C on(C.id=B.id)); drop table c; create table c(select * from temp); drop table temp; という方法ですが、もう少しスマートな処理方法がないか、 そして、default値が反映されたものにしたいのです。 (上記を実行すると以下になります) ・table temp +------+------------------+------+------+ | id | name | id_A | flag | +------+------------------+------+------+ | 1 | 手順書作成 | 1 | 1 | | 2 | レビュー | 1 | 0 | | 3 | 開発 | 2 | 0 | | 4 | 社内研修 | 3 | 1 | | 5 | 社外研修 | 3 | NULL |←NULLではなく、FALSEとしたい +------+------------------+------+------+ どうぞ宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの書き方

    わからないので質問をさせて頂きます。 テーブルAに、money、rank、name、IDと言うカラムがあります。 テーブルBに、IDとpointと言うカラム名があります。 テーブルAのIDを指定し、テーブルBに同じIDが存在する場合 テーブルAとBの値を取得するSQLを書いています。 Select テーブルA.money,テーブルA.rank テーブルA.name,テーブルA.ID,テーブルB.point FROM テーブルA,テーブルB Where テーブルA.ID = '5'; このように書くとmoney,rank,name、IDは重複して表示がされ pointに関してはすべてのpointが表示されてしまいます…。 重複するのでdistinctを使ったのですが うまくいかず…。 SQL初心者ですが、よろしければ教えてください。

    • ベストアンサー
    • MySQL