• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLを教えてください)

SQLで商品マスタの一覧を出す方法についての質問

このQ&Aのポイント
  • 商品マスタの一覧を表示する際に、商品に付随しているカラーやサイズも表示したいです。SQLでズバッと取得する方法はありますか?
  • 商品マスタの一覧を表示する際、カラーとサイズも一緒に表示したいですが、1行1行商品ごとにカラーとサイズをループする必要があるのでしょうか?SQLで効率的に取得する方法があれば教えてください。
  • 商品マスタの一覧を表示する際に、カラーとサイズも表示したいです。SQLを使用して商品ごとにループせずに取得する方法があれば教えてください。

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

create view 商品サイズ as select 商品ID, sys_connect_by_path(サイズ名,',') as サイズ名 from (select 商品マスタ.商品ID,商品マスタ.商品名,サイズマスタ.サイズ名, Row_Number() over(partition by 商品マスタ.商品ID order by 商品サイズマスタ.サイズID) as Rank, count(商品マスタ.商品ID) over(partition by 商品マスタ.商品ID) as MaxLevel from 商品マスタ join 商品サイズマスタ on 商品マスタ.商品ID = 商品サイズマスタ.商品ID join サイズマスタ on 商品サイズマスタ.サイズID = サイズマスタ.サイズID ) where Level = MaxLevel start with Rank = 1 connect by Prior 商品ID = 商品ID and Prior Rank = Rank-1; create view 商品カラー as select 商品ID,商品名, sys_connect_by_path(カラー名,',') as カラー名 from (select 商品マスタ.商品ID,商品マスタ.商品名,カラーマスタ.カラー名, Row_Number() over(partition by 商品マスタ.商品ID order by 商品カラーマスタ.カラーID) as Rank, count(商品マスタ.商品ID) over(partition by 商品マスタ.商品ID) as MaxLevel from 商品マスタ join 商品カラーマスタ on 商品マスタ.商品ID = 商品カラーマスタ.商品ID join カラーマスタ on 商品カラーマスタ.カラーID = カラーマスタ.カラーID ) where Level = MaxLevel start with Rank = 1 connect by Prior 商品ID = 商品ID and Prior Rank = Rank-1; で select 商品カラー.*,商品サイズ.サイズ名 from 商品カラー join 商品サイズ on 商品カラー.商品ID = 商品サイズ.商品ID; まあ、かなり無理やりですね。一旦VIEWにしないとOracleの構文解析のバグなのか一発で通らないし、階層別問合せの結果はINDEXが使えないので負荷が高いです。

angelinaane
質問者

お礼

回答ありがとうございます。 うーん、難しそうですね。 もう少し勉強してから 試してみたいと思います。

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

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

手元にOracleが無いけど、こんな感じかな。 SELECT A.商品ID,A.商品名, NVL2(C.カラーID,C.カラー名 || '・','') || NVL2(E.カラーID,E.カラー名 || '・','') || NVL2(G.カラーID,G.カラー名 || '・','') カラー, NVL2(I.サイズID,I.サイズ || '・','') || NVL2(K.サイズID,K.サイズ || '・','') || NVL2(M.サイズID,M.サイズ || '・','') サイズ (((((((((((FROM 商品マスタ A LEFT OUTER JOIN 商品カラーマスタ B ON A.商品ID=B.商品ID) LEFT OUTER JOIN (SELECT カラーID,カラー名 FROM カラーマスタ WHERE カラー名='赤') C ON B.カラーID=C.カラーID) LEFT OUTER JOIN 商品カラーマスタ D ON A.商品ID=D.商品ID) (SELECT カラーID,カラー名 FROM カラーマスタ WHERE カラー名='黒') E ON D.カラーID=E.カラーID) LEFT OUTER JOIN 商品カラーマスタ F ON A.商品ID=F.商品ID) (SELECT カラーID,カラー名 FROM カラーマスタ WHERE カラー名='黒') G ON F.カラーID=G.カラーID) LEFT OUTER JOIN 商品サイズマスタ H ON A.商品ID=H.商品ID) (SELECT サイズID,サイズ FROM サイズマスタ WHERE サイズ='S') I ON H.サイズID=I.サイズID) LEFT OUTER JOIN 商品サイズマスタ J ON A.商品ID=J.商品ID) (SELECT サイズID,サイズ FROM サイズマスタ WHERE サイズ='M') K ON J.サイズID=K.サイズID) LEFT OUTER JOIN 商品サイズマスタ L ON A.商品ID=L.商品ID) (SELECT サイズID,サイズ FROM サイズマスタ WHERE サイズ='L') M ON L.サイズID=M.サイズID 古いバージョンだと外部結合の記述が違います。 理論は例えば「赤」ですが、赤だけ抽出したサブクエリを作り、 これに外部結合します。赤があれば結合しますが、無ければNULLです。 NVL2関数でNULLでない時と、NULLの時の編集をします。 同じことを他の色やサイズにも応用します。 イマイチ、やりたいことが分からないのですが、どういう表示に したいかもう少し補足してください。

angelinaane
質問者

お礼

回答ありがとうございます。 カラーもサイズも例として挙げただけで、 種類がもっとあるのです。 分かりにくい説明ですみません。 難しそうですね。

全文を見る
すると、全ての回答が全文表示されます。
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.2

>商品カラー、商品サイズは商品に対して複数あります。 最大いくつありますか? 上限を決められるなら可能です。 分析関数を使ってn番目の値を順に結合すればできます。

angelinaane
質問者

お礼

回答ありがとうございます。 上限はわかりません。 難しそうですね。

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

無理だと思います。 リレーショナルデータベースではカラムが複数の値をもつのは不可能なので。

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

関連するQ&A

  • エクセルからSQLサーバをアクセス

    OS:Win2000,Office2000,SQLサーバ2000という環境で、エクセルとSQLサーバの連携をしたいと思っています。 SQLサーバ内に商品コード、商品名、単価と格納されていたとして、エクセル上でセルのA列に商品コードを入れると、SQLサーバの商品マスタを検索して、B列に商品名、C列に単価を表示させる、といった事は可能なのでしょうか? 宜しくお願い致します。

  • SQL文のエラー

    SQL文でエラーが表示されます。どの部分を修正すればいいですか? SQL文が長いので文字列を結合する演算子「.」を使って複数行に分けています。 エラー内容:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ? and product_id = product.id' at line 2 //商品番号だけでなく、商品名や価格も表示したいので商品情報を保持するproductテーブルと 結合する。 //全て取得するのでSELECTは* //favoriteテーブルにはcustomer_idとproduct_id //productテーブルにはid, name, price $sql = 'SELECT * FROM favorite, product' . 'WHERE customer_id = ? and product_id = product.id '; // ?に顧客番号を指定する。 // favoriteテーブルの商品番号(product_id列)と、productテーブルの商品番号(id列)が // 一致している行だけが必要なので、WHERE句に条件を追加する。

  • SQLコマンドによるデータ抽出について

    例えば 商品マスタという商品ID、商品名、単価のフィールドを含んだテーブルと 販売履歴というID、商品ID、販売日時というフィールドを含んだテーブルがあります。 各商品の一番最後に売れた販売日時を知るために この2つのテーブルからSELECT文で商品ID、商品名、販売日時の フィールドを結果として返すSQL文を作りたいです。 各商品なので全く売れていない商品でも商品IDと商品名だけは結果に欲しいです。 どなたかSQLに詳しい方、教えてください。

  • SQLで可能かどうかお教えください

    お疲れ様です。毎回困った時にはこのコミュニティを参考にしているものです。下記のような事ができるかご存知であれば教えて頂けると助かります。 **質問** 以下のテーブルがあります ID || BOX_ORDER ||  INSIDE_ORDER||  DISP_NAME 001 ||  1      ||    1     || 表示名1-1-1 001 ||  1      ||    2     || 表示名1-1-2 001 ||  2      ||    1     || 表示名1-2-1 002 ||  1      ||    1     || 表示名2-1-1 003 ||  3      ||    1     || 表示名3 上記テーブルをSQLを使用し以下のように取得するのは可能でしょうか? (希望実行結果) ID || BOX_ORDER1 || BOX_ORDER2 ||BOX_ORDER3 001 || 表示名1-1-1 <br> ||表示名1-2-1|| || 表示名1-1-2 || || 002 || 表示名2-1-1 || || 003 || || ||表示名3 ポイント ・ID及びBOX_ORDERが一致するデータはIDの行のBOX_ORDER1~BOX_ORDER3の各列に表示名を格納。BOX_ORDERが同一のものが複数件ある場合は<br>(文字列)を結合して同列に格納する。 ・BOX_ORDER1~BOX_ORDER3は固定 煩雑に書いて分かりにくいかもわかりませんが、御助力頂けたら助かります。よろしくお願い致します。

  • sql server whereについて

    sql server express2012 のselect文で select * from 商品マスタ where 商品コード in (1,2,3,1)とした場合、商品マスタには商品コード=1のデータは1件しかないけど、商品コード=1のデータ(同一データ)を2行表示する方法はありませんか? 宜しくお願いします

  • group byにより集計した結果での名称取得方法

    次のようなテーブルがあったとして、一回のSQLで商品名称とその売上件数の一覧を作成することは可能なのでしょうか? 【売上テーブル】 ID 販売日 商品ID 0001 2011/01/01 1 0002 2011/01/01 2 0003 2011/01/03 1 0004 2011/01/10 1 0005 2011/01/12 2 ・・・ 【商品マスタ】 ID 商品名 1 りんご 2 みかん 3 いちご 【最終的に作成したい一覧】 商品名 件数 りんご 3 みかん 2 いちご 0 ※売上テーブルに存在しない商品についても、件数が0件として一覧に出力出来るようにしたいです。 select 商品ID from 売上テーブル group by 商品ID にて商品ID毎の件数を算出し、それとは別に select ID,商品名 from 商品マスタ として、商品IDと名称のリストを取得後、アプリにてこれらの情報を突き合わせれば実現できるのは分かるのですが、これらの処理を一回のSQLにまとめることは可能なのでしょうか? よろしくお願いします。

  • ACCESS SQLステートメントについて初心者です。

    お知恵を貸してください。 ACCESSでSQLステートメントで 『Aテーブル』 ID  商品コード1 商品コード2 1    1111    2222 2    2222    3333 3    4444    5555   『Bテーブル(商品コードマスター)』 商品コード  商品名 1111     ああああ 2222     いいいい       3333     うううう 4444     ええええ 5555     おおおお AテーブルとBテーブルを結合して ID  商品コード1 商品名    商品コード2   商品名 1    1111  ああああ     2222    いいいい 2    2222  いいいい     3333    うううう 3    4444  ええええ     5555    おおおお というCテーブルを作りたいです。 商品コード1と商品コード2の両方共 Bテーブルの商品コードから商品名を取得したいのですが、できないのですが・・・・ 出来ればBテーブル(商品コード)を2つ作くったり等したくないのですが、SQLステートメントでどう記述すれば良いですか?      

  • 要求を満たすことのできるSQL文を教えてください

    現在、売上の明細を明細IDごとにグループ化し合計値を表示させるプログラムを開発中です。 以下のような要件を満たすSQL文を教えてください。 【もともとの売上の明細のテーブル】 明細ID | NAME | KINGAKU 001  |商品A | 1000 001 |商品B | 500 001 |商品C | 300 002 |商品A | 1000 002 |商品D | 1500 【グループ化後のテーブル】 明細ID | NAME | KINGAKU 001 |商品A | 1800 002 |商品D | 2500 ・明細IDごとに金額を合計する。 ・NAMEの列については、その明細IDの中で最大の金額の商品名を入れる。 ※現在、明細IDごとに金額を合計するのはできているのですが、  もう1つの要件をどのようにすれば達成できるのか分からない  状況です。要件を満たすことのできるSQL文をぜひ教えてください。 よろしくお願いいたします。

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • SQLの書き方について

    下記のSQL文に科目マスタから科目名を取得する文を追加したいと考えてます。 色々と考えてみたのですが、私のスキルでは上手く行かなくて困っています。 どなたか教えて頂けないでしょう? 宜しくお願いします。 DB:アクセス97・アクセス2000 科目マスタ 科目CD  科目名 SELECT U.商品CD, 商品マスタ.商品名, U.[部署CD], 部署マスタ.部署名, U.SUM受払数 FROM 部署マスタ INNER JOIN ((SELECT 商品CD,受払年月日,部署CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 = '20110510' GROUP BY 商品CD,部署CD,受払年月日,受払数) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD) ON 部署マスタ.部署CD = U.部署CD ORDER BY U.商品CD, U.[部署CD], U.受払年月日, U.[SUM受払数] 科目名を取得する文を追加後のSQL文 SELECT U.商品CD, 商品マスタ.商品名, U.部署CD, 部署マスタ.部署名, U.科目CD, 科目マスタ.科目名, U.SUM受払数 FROM 部署マスタ INNER JOIN ((SELECT 商品CD,受払年月日,部署CD,科目CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 = '20110510' GROUP BY 商品CD,部署CD,受払年月日,科目CD,受払数 ) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD ) ON 部署マスタ.部署CD = U.部署CD ORDER BY U.商品CD, U.部署CD, U.受払年月日, U.科目CD, U.SUM受払数 上記のSQLを実行するとエラーになります。 SQL実行中に以下のエラーが発生しました。 エラーコード:-3100 [Microsoft][ODBC Microsoft Access Driver] クエリ式 'U.商品CD = 商品マスタ.商品CD INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD' の 構文エラー : 演算子がありません。 SQLステータス:37000 宜しくお願いします。