こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SQLについてアドバイスください。

USER_TAB_COLUMNSから入力したテーブル名で構造を抽出し
SQL文を作成出来るものを作ろうとしています。

80%までうまく行くのですが、SELECT文でフィールドをカンマ付けで置いていく
所で最後のフィールドに来た時カンマが付加されてしまいます。
これを最後のフィールドに来た時カンマが付加されないでスペースで置くように
したいのですが。。

set pagesize 0
set linesize 1000
set trimspool on
set feedback off
set verify off

ACCEPT TABLE CHAR PROMPT 'TABLE NAME:'

set termout off
spool C:\TEST_csv.sql

SELECT 'SELECT ' FROM DUAL;
SELECT COLUMN_NAME || ','
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = UPPER( '&TABLE' )
ORDER BY COLUMN_ID;
SELECT 'FROM DUAL' FROM DUAL;

SPOOL OFF

投稿日時 - 2005-09-02 14:17:42

QNo.1621755

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

なんか自分で解決する気ありますか?
ここまでくればGoogleで一発でしょ。

夏休みの宿題を手伝っている気がします。

外部結合の意味は調べたのですか?

参考URL:http://www.mitene.or.jp/~rnk/TIPS_ORCL_TBLLINK1.htm#TBLLINK3

投稿日時 - 2005-09-02 22:27:21

お礼

まぁー夏休みの宿題みたいなもんですね。
(おーテキビシー)(+_+)

結局、アドバイス頂いたSQLは、MAX列の項目した取れませんでしたので、(外部結合は理解しているつもりなのですが・・私の実力では無理でした)
それを生かして前半部を以前のままと後半部分をそのSQLでくっつけました。
もっと簡単なSQL文があるかもしれませんが、まー出来ればいいかということでこれでよしとします。
アドバイスありがとうございました。m(_ _)m

投稿日時 - 2005-09-05 10:47:33

ANo.2

No.1です。

外部結合がうまくいっていないようですね。

> AND USER_TAB_COLUMNS.COLUMN_ID (+) = MAX_ID.ID

の辺りを直してください。たぶんこんなかんじ↓

AND USER_TAB_COLUMNS.COLUMN_ID = (+) MAX_ID.ID

投稿日時 - 2005-09-02 19:31:42

補足

>
AND USER_TAB_COLUMNS.COLUMN_ID = (+) MAX_ID.ID

これじゃー文法エラーですよ。
AND USER_TAB_COLUMNS.COLUMN_ID = MAX_ID.ID
これもダメですし、うまくいきませんね。
よろしくお願いします。

投稿日時 - 2005-09-02 20:06:39

ANo.1

2番目のクエリにCOLUMN_IDのMAXを取るサブクエリを作成し、
USER_TAB_COLUMNSと外部結合。
USER_TAB_COLUMNSのCOLUMN_IDがMAXでなかったら,を付加、
COLUMN_IDのMAXだったらスペースになるようにクエリを作ればいいのではないでしょうか。

試していませんがこんなかんじ↓

SELECT COLUMN_NAME || NVL2(ID,' ' ',' )
FROM USER_TAB_COLUMNS,
(
SELECT MAX(COLUMN_ID) ID
FROM USER_TAB_COLUMNS
) MAX_ID
WHERE TABLE_NAME = UPPER( '&TABLE' )
AND USER_TAB_COLUMNS.COLUMN_ID += MAX_ID.COLUMN_ID
ORDER BY COLUMN_ID;

投稿日時 - 2005-09-02 14:53:12

補足

ヒントいただきありがとうございます。
最大のカラムIDになったらスペースをセットする
という事は考えたのですが、うまくいきませんでした。
実行すると最後のカラム名だけがセットされます。

ご教授頂きました、SQL文はエラーがあり
(まあテストしていないからですね)
下記のように直しましたが、うまくいきません。
Dual文を抜きます。↓
SELECT COLUMN_NAME || NVL2(ID,' ',',' )
FROM USER_TAB_COLUMNS,
(
SELECT MAX(COLUMN_ID) ID
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = UPPER('&TABLE' )
) MAX_ID
WHERE
TABLE_NAME = UPPER('&TABLE')
AND USER_TAB_COLUMNS.COLUMN_ID (+) = MAX_ID.ID
ORDER BY COLUMN_ID;

投稿日時 - 2005-09-02 17:15:52

あなたにオススメの質問