- PR -

列を行に変換するには

1
投稿者投稿内容
まろ茶
会議室デビュー日: 2004/07/28
投稿数: 17
投稿日時: 2006-11-01 20:35
環境は以下の通りです。
DB:Oracle9i

下記の図のように格納されているTEL1,TEL2
を行に変換したいと考えています。

+--+-----+-----+
|id |TEL1 |TEL2 |
+--+-----+-----+
|1 |1111 |2222 |
|2 |3333 |4444 |
|3 |5555 |6666 |
+--+-----+-----+

    ↓

+--+-----+
|id | TEL |
+--+-----+
|1 |1111 |
|1 |2222 |
|2 |3333 |
|2 |4444 |
|3 |5555 |
|3 |6666 |
+--+-----+

SQLServer2005であれば
UNPIVOT、PIVOTを使って出来るそうなのですが、
ORACLEではどのようにすれば
良いのでしょうか。




[ メッセージ編集済み 編集者: まろ茶 編集日時 2006-11-01 20:43 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-11-01 21:38
UNIONを使うのではまずいのですか?
まろ茶
会議室デビュー日: 2004/07/28
投稿数: 17
投稿日時: 2006-11-02 13:41
返信ありがとうございます。
すいません。補足致します。
UNIONを使って実行させたのですが、

 「ORA-00604:再帰SQLレベル1でエラーが発生しました。」
 「ORA-04031:共有メモリーの296バイトを割当てできません」

と表示されてしまいました。
UNIONでつなげたい列が1〜90まであり、
SQLが長くなりすぎてエラーが発生したのだと考えます。

ですので、UNIONを使わずに
変換する方法はございませんでしょうか。



[ メッセージ編集済み 編集者: まろ茶 編集日時 2006-11-02 13:42 ]
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-11-02 13:49
表関数
ワークテーブルとデカルト積
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-11-02 15:58
引用:

まろ茶さんの書き込み (2006-11-02 13:41) より:
UNIONを使って実行させたのですが、

 「ORA-00604:再帰SQLレベル1でエラーが発生しました。」
 「ORA-04031:共有メモリーの296バイトを割当てできません」

と表示されてしまいました。
UNIONでつなげたい列が1〜90まであり、
SQLが長くなりすぎてエラーが発生したのだと考えます。


良くは知りませんが、union でダメなら union all を使うとできることがあります。今回は、非正規化のテーブルを正規化したいわけであり、別段 union という演算をしたいわけではないと思いますし。
しかし、そもそも非正規化されているテーブルを正規化する処理は、むりやり DBMS のサーバー側でやらずにそれにアクセスするクライアント側でやったほうが良いかもしれません。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-11-02 17:21
エラーの内容から行くと、共有プールが足りないということなので、shared_pool_sizeなど関連する設定を調節すればいいのではないかと思います。
#ORA-04031で検索するといろいろ情報が出てきます。

ですが、根本的には、unibonさんも指摘されているようにテーブル設計に問題があり
そうなので設計を変更できないか検討するとか、それができないのであればSQLでは
なくデータ取得後に加工するとか考えたほうがいいと思います。
1

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