お世話になります。
商品マスタと商品カラーマスタと商品サイズマスタがあります。
商品マスタの一覧を出したいのですが、
商品に付随しているカラーやサイズも一緒に表示したいのです。
商品マスタ(商品ID・商品名)
商品カラーマスタ(商品カラーマスタID・商品ID・カラーID)
商品サイズマスタ(商品サイズID・商品ID・サイズID)
カラーマスタ(カラーID・カラー名)
サイズマスタ(サイズID・サイズ)
という構成です。
商品カラー、商品サイズは商品に対して複数あります。
表示したい一覧は
商品ID・商品名・カラー・サイズ
で
商品1つに対して1行で表し
カラー列、サイズ列は「赤・黒・茶」「S・M・L」というように
書きたいのです。
SQLでズバッと取得する方法はありますか?
1行1行、商品ごとに
カラー・サイズをループしなくてはいけないのでしょうか?
教えてください。
よろしくお願いします。
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が使えないので負荷が高いです。
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の時の編集をします。
同じことを他の色やサイズにも応用します。
イマイチ、やりたいことが分からないのですが、どういう表示に
したいかもう少し補足してください。
回答ありがとうございます。
カラーもサイズも例として挙げただけで、
種類がもっとあるのです。
分かりにくい説明ですみません。
難しそうですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- その他(Microsoft Office) EXCEL VLOOKUPに関する質問 5 2023/02/08 11:38
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- SQL Server SQLのクエリの書き方 1 2022/03/29 23:06
- Visual Basic(VBA) 【ExcelVBA】Powerクエリーでいうピボット解除と同じ処理をVBAで 4 2022/07/06 17:09
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01722: 数値が無効です
-
他のテーブルの抽出条件で更新...
-
MySQLで改行を含む文の登録のし...
-
SQLでグループ化した結果の件数...
-
ORACLEのUPDATEについて...
-
項目名の制限について
-
GROUP BYの記述方法について
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
セルの右クリックで出る項目を...
-
Vbaでアクセスからエクセルにリ...
-
変数が選択リストにありません
-
Accessでテーブル名やクエリ名...
-
Accessのフィールド数が255しか...
-
ACCESSでの改行コード
-
Accessのクエリでデータの入力...
-
ACCESSのクエリで集計で、先頭...
-
INSERT INTO ステートメントに...
-
BLOB型のPDF出力の方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
項目名の制限について
-
MySQLで改行を含む文の登録のし...
-
SQLでグループ化した結果の件数...
-
オラクルSQLの累計値取得方法に...
-
ORA-01722: 数値が無効です
-
SQL文 2つのテーブルから、グ...
-
列名無効について
-
フォームで検索 エラーの表示...
-
改行コードを削除して取得する...
-
3つのテーブルの結合
-
各店舗毎の最大売上の項目を取...
-
インサート文での条件の指定に...
-
Accessで期間指定の売上合計と...
-
アクセス レポート作成のため...
-
データベースから抽出した一覧...
-
SQL抽出方法に悩んでいます。 S...
-
GROUP BYの記述方法について
-
SQL文のエラーについて
-
AccessVBA コードをスキップし...
-
Oracleでテーブルの結合について
おすすめ情報