こんにちは。
テーブルAに以下のようなデータがあるとします。
ID |名称 |項目
--------------
01 |ああ |
02 |いい |
03 |うう |01,02
04 |ええ |01
SELECT文で取得したいのは、フィールド「項目」の値を、他のレコードの名称で置き換えた列です。
つまり、
ID |名称 |項目 |項目名称
------------------
01 |ああ | |
02 |いい | |
03 |うう |01,02 |ああ,いい
03 |ええ |01 |ああ
という結果が欲しいということです。
「項目」の値はカンマで区切られています。
これを一つのSQLで取得したいと思っています(テーブルの結合、サブクエリーはOK)が、方法がわかりません。
どなたかどうぞご教授ください。
よろしくお願い致します。
No.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です。
テーブルレイアウトの変更はできず、限定条件からも外れているため、SQL一発じゃ取れないみたいですね。
結局ユーザー定義関数を組んで取得しました。
連絡が遅くなり申し訳ありません。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Oracle SQL update方法 2 2022/06/22 14:07
- Visual Basic(VBA) Excel VBAのリストボックスの値を他のフォームに反映させる方法を教えてください。 2 2023/07/14 14:06
- JavaScript html javascriptにてWeb SQLを操作したい。 2 2022/12/16 17:43
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
DBのタイプの指定とサイズにつ...
-
APN設定について教えていただけ...
-
BIOSでAHCIに設定したいが、項...
-
Excelで空白以外の値がある列の...
-
エクセルVBAで5行目からオート...
-
datファイルからaccessにインポ...
-
Joy To Keyのマウスやキーボー...
-
Accessのハイパーリンク...
-
必須入力項目と入力必須項目
-
Oracle 2つのDate型の値の差を...
-
エクセル印刷時左の枠をヘッダ...
-
スティックパリティの役割
-
Access2000 レポートの並び替...
-
ハイパースレッディングの停止方法
-
2行目を表示できますか?
-
yes/no型の更新ができない
-
アップロードした写真を撮影日...
-
SQLのSELECT文で*を使わない理由
-
ネット検索した項目を消す方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
セルの右クリックで出る項目を...
-
Access テキスト型に対する指定...
-
SUBSTRING 関数に渡した長さの...
-
Accessで数値型にNULLをInsert...
-
APN設定について教えていただけ...
-
エクセルグラフの凡例スペース
-
ORACLEでLONG項目からCHAR項目...
-
複数のレコードを1つのレコード...
-
空白をそのままインポートする...
-
アンドロイド おサイフケータイ...
-
access2000:フォームで入力し...
-
VBAで複数の数式セルを最終行ま...
-
株に関する用語集
-
必須入力項目と入力必須項目
-
他テーブルで一致する列から名...
-
BIOSでAHCIに設定したいが、項...
-
datファイルからaccessにインポ...
おすすめ情報