- ベストアンサー
SQL文でテーブルAのデータを取得する方法
- テーブルAのデータを一つのSQL文で取得する方法を教えてください。
- テーブルAのフィールド「項目」の値を他のレコードの名称で置き換えた列を取得したいです。
- 「項目」の値はカンマで区切られています。テーブルの結合やサブクエリーを使用して一つのSQLで取得する方法を教えてください。
- みんなの回答 (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一発じゃ取れないみたいですね。 結局ユーザー定義関数を組んで取得しました。 連絡が遅くなり申し訳ありません。 ありがとうございました!