- PR -

ORACLEで文字列結合について

1
投稿者投稿内容
えむてぃー
会議室デビュー日: 2007/08/24
投稿数: 11
投稿日時: 2007-10-24 14:13
ORACLE 10gで下記のようなテーブルを元にVIEWを作ろうと考えています。

お店テーブル
--------------------
お店ID     店名
--------------------
00000001  AAAA
00000002  BBBB
--------------------

商品テーブル
----------------------
商品ID   商品名
----------------------
S001    大根
S002    ネギ
S003    トマト
----------------------

取り扱いテーブル
----------------------
お店ID      商品ID
----------------------
00000001    S001
00000001    S002
00000001    S003
00000002    S001
00000002    S003
----------------------

取り扱いテーブルでお店テーブルと商品テーブルを結合したVIEWを
作成するのですが、下記VIEWのようにお店1に対して1レコードにしたいです。
そのために商品名を「,」区切りで1レコードに表示する方法(SQL)
などありますでしょうか?

取り扱いVIEW
--------------------------------------------------------
お店ID   店名   取り扱い商品
--------------------------------------------------------
00000001  AAAA   大根,ネギ,トマト
00000002  BBBB   大根,トマト
--------------------------------------------------------

いろいろ調べたのですが、見つからず投稿いたしました。
もしよろしければご教授願います。

以上、宜しくお願いいたします。
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2007-10-24 14:20
商品の数がいくつになるか不定の場合には無理です。
最大数がわかっていれば何とかなりますけど。
えむてぃー
会議室デビュー日: 2007/08/24
投稿数: 11
投稿日時: 2007-10-30 09:18
無理ですかぁ。。。
ありがとうございます。
別の方法を検討してみます。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-10-30 12:37
直接の回答じゃないけど、
Group_Concat関数を階層問い合わせで模倣(oraclesqlpuzzle.hp.infoseek.co.jp)
を使えばできそうな気がする。

ってか、もう見てないかも...
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-10-30 14:37
回答とは無関係

この質問は定期的にでてくるなぁ
AC
会議室デビュー日: 2004/04/15
投稿数: 18
投稿日時: 2007-10-30 16:16
無理やりですがSQL Server 2005 Expressでやってみました。

コード:
WITH 取り扱いVIEW(お店ID, 店名, 取り扱い商品)

AS (
SELECT
S1.お店ID
, S1.店名
, CAST(P1.商品名 AS varchar) AS 取り扱い商品
FROM お店 AS S1
INNER JOIN 取り扱い AS L1
ON L1.お店ID = S1.お店ID
INNER JOIN 商品 AS P1
ON P1.商品ID = L1.商品ID
UNION ALL
SELECT
S2.お店ID
, S2.店名
, CAST(取り扱いVIEW.取り扱い商品 + ',' + P2.商品名 AS varchar) AS 取り扱い商品
FROM お店 AS S2
INNER JOIN 取り扱いVIEW
ON 取り扱いVIEW.お店ID = S2.お店ID
INNER JOIN 取り扱い AS L2
ON L2.お店ID = S2.お店ID
INNER JOIN 商品 AS P2
ON P2.商品ID = L2.商品ID
AND 取り扱いVIEW.取り扱い商品 NOT LIKE '%' + P2.商品名 + '%'
)

SELECT * FROM 取り扱いVIEW AS LOB
WHERE LOB.取り扱い商品
= (SELECT TOP 1 取り扱い商品
FROM 取り扱いVIEW
WHERE お店ID = LOB.お店ID
ORDER BY 取り扱い商品 DESC)
ORDER BY お店ID



Oracle 10gがSQL99の共通表式(Common Table Expression)に対応していれば出来るのではないでしょうか?

# SQL文の間違いを修正しました。

[ メッセージ編集済み 編集者: AC 編集日時 2007-10-30 16:21 ]
えむてぃー
会議室デビュー日: 2007/08/24
投稿数: 11
投稿日時: 2007-11-04 11:49
返信遅れて申し訳ありません。
>かずくんさん
参考サイト提示して頂きありがとうございます。
さっそく検証してみます。

>七味唐辛子さん
同じ投稿になったようで、申し訳ありません。
みなさんも結構同じところで悩んでるのですねw
ちょっと過去の投稿を検索してみます。

>ACさん
ご丁寧にSQL文を提示して頂きまして、ありがとうございます。
コチラもさっそく検証してみます。

返信して頂いたみなさん、ご協力感謝致します。
1

スキルアップ/キャリアアップ(JOB@IT)