- - PR -
列を行に変換するには
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2006-11-01 21:38
UNIONを使うのではまずいのですか?
| ||||
|
投稿日時: 2006-11-02 13:41
返信ありがとうございます。
すいません。補足致します。 UNIONを使って実行させたのですが、 「ORA-00604:再帰SQLレベル1でエラーが発生しました。」 「ORA-04031:共有メモリーの296バイトを割当てできません」 と表示されてしまいました。 UNIONでつなげたい列が1〜90まであり、 SQLが長くなりすぎてエラーが発生したのだと考えます。 ですので、UNIONを使わずに 変換する方法はございませんでしょうか。 [ メッセージ編集済み 編集者: まろ茶 編集日時 2006-11-02 13:42 ] | ||||
|
投稿日時: 2006-11-02 13:49
表関数
ワークテーブルとデカルト積 | ||||
|
投稿日時: 2006-11-02 15:58
良くは知りませんが、union でダメなら union all を使うとできることがあります。今回は、非正規化のテーブルを正規化したいわけであり、別段 union という演算をしたいわけではないと思いますし。 しかし、そもそも非正規化されているテーブルを正規化する処理は、むりやり DBMS のサーバー側でやらずにそれにアクセスするクライアント側でやったほうが良いかもしれません。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||
|
投稿日時: 2006-11-02 17:21
エラーの内容から行くと、共有プールが足りないということなので、shared_pool_sizeなど関連する設定を調節すればいいのではないかと思います。
#ORA-04031で検索するといろいろ情報が出てきます。 ですが、根本的には、unibonさんも指摘されているようにテーブル設計に問題があり そうなので設計を変更できないか検討するとか、それができないのであればSQLでは なくデータ取得後に加工するとか考えたほうがいいと思います。 | ||||
1
