アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。

テーブルAに以下のようなデータがあるとします。

ID |名称 |項目
--------------
01 |ああ |
02 |いい |
03 |うう |01,02
04 |ええ |01

SELECT文で取得したいのは、フィールド「項目」の値を、他のレコードの名称で置き換えた列です。
つまり、

ID |名称 |項目 |項目名称
------------------
01 |ああ | |
02 |いい | |
03 |うう |01,02 |ああ,いい
03 |ええ |01 |ああ

という結果が欲しいということです。

「項目」の値はカンマで区切られています。
これを一つのSQLで取得したいと思っています(テーブルの結合、サブクエリーはOK)が、方法がわかりません。

どなたかどうぞご教授ください。
よろしくお願い致します。

A 回答 (1件)

こんにちは。


個人的な意見ですが、このようなテーブルは正規化したほうが良いかと思いますが…

SQLでは、上記の例ですとID=03のレコードから「01,02」という値(文字列)は取得できますが、「01」というデータと「02」というデータを個別にとることは出来ません。
しかも、カンマでいくつ区切られているのかがわからないと、何度繰り返し処理を行えばよいかがわかりません。SQLにそこまで高度な処理を求めるのは無茶です。
とりあえず、「01,02」という値を取得して、これを分解してからもう一度SQLを回す方法が良いかと思います。

どうしてもというのであれば、
【限定1】IDは必ず2桁
【限定2】項目は絶対にカンマ区切りで、余分なスペース等が入らない
【限定3】項目は最大3つのID
で、こんな感じで出来なくも無いです。

SELECT ID, 名称, NULL, NULL
FROM テーブル
WHERE 項目 IS NULL

UNION
SELECT A.ID, A.名称, A.項目, B.名称
FROM テーブル AS A, テーブル AS B
WHERE LEN((A.項目) = 2
AND B.コード=A.項目

UNION
SELECT A.ID, A.名称, A.項目, B.名称 & ',' & C.名称
FROM テーブル A, テーブル B, テーブル C
WHERE LEN(A.項目)=5
AND B.コード = MID(A.項目,1,2)
AND C.コード = MID(A.項目,4,2)

UNION
SELECT A.ID, A.名称, A.項目, B.名称 & ',' & C.名称 & ',' & D.名称
FROM テーブル A, テーブル B, テーブル C, テーブル D
WHERE LEN(A.項目)=8
AND B.コード = MID(A.項目,1,2)
AND C.コード = MID(A.項目,4,2)
AND D.コード = MID(A.項目,7,2)
;

MIDとかLENとかは、DBMSにより変わります。
MID(A,B,C)は文字列AのB番目の文字がC文字分だけ抽出した文字列を返す関数、
LEN(A)は文字列Aの文字列長を返す関数です。DBMSによりこのへんの値を変えてください。

項目カラム内のIDの最大数が増えたら、UNION SELECTをもっと増やせばとりあえずOKです。
    • good
    • 0
この回答へのお礼

テーブルレイアウトの変更はできず、限定条件からも外れているため、SQL一発じゃ取れないみたいですね。

結局ユーザー定義関数を組んで取得しました。

連絡が遅くなり申し訳ありません。
ありがとうございました!

お礼日時:2005/06/03 10:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!