- PR -

insertする際に検索結果を反映するのは可能でしょうか。

投稿者投稿内容
タラン
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 138
投稿日時: 2006-04-11 11:10
お世話になります。

検索結果のinsert文
insert into tableA (columnA, columnB) select columnA, columnB from tableB where columnC = 'aa';

上記の書き方だとよいのですが
引数の数が違う場合も検索結果を反映するのができるのでしょうか。

例えば、
insert into tableA (columnA, columnB, columnB) values(select_columnA, xxx, select_columnB) select select_columnA, select_columnB from tableB where columnC = 'aa';

よろしくお願いします。
ibara
常連さん
会議室デビュー日: 2002/11/15
投稿数: 26
投稿日時: 2006-04-11 12:15
「引数」というのがよくわかりませんが、こういうことですか?

insert into tableA (columnA, columnB, columnC)
select columnA, 'XXX', columnC from tableB where columnC = 'aa';
タラン
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 138
投稿日時: 2006-04-11 12:52
質問が分かりにくくてごめんなさい。><

検索した結果をInsert文で使おうと思っております。
もちろん、一つのSQL文でです。
一般的に下記のは正しいSQL文ですよね。
insert into tableA (columnA, a, columnB) select a from tableB where columnC = 'aa';

今回、私が作成したSQL文は tableBからaを取得してtableAの2番目のカラムに挿入したいです。
これって可能でしょうか。
変な質問で申し訳ありませんがよろしくお願いします。


[ メッセージ編集済み 編集者: MUSE 編集日時 2006-04-11 12:53 ]
GUCCHI
会議室デビュー日: 2005/10/27
投稿数: 17
投稿日時: 2006-04-11 12:57
できるかできないか、まずは自分で検証してみてください。
そして、その結果の状況を教えてください。
ついでに、実行環境も教えてください。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-04-11 12:58
TableBから取得した列aの値をtableAの2列目?にいれたいんでしょうか?
では残りのcolumnA,columnBには何を入れるのでしょうか?

Insert into 表名(列名) values (値) ;

Insert into 表名 select 〜 がごっちゃ混ぜになっている気がします。

また、DBMSの種類によってはできるSQLも変わるので、
対象DBMSの名前とそのバージョンを提示したほうがいいかと思います。
タラン
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 138
投稿日時: 2006-04-11 14:35
Oracleです。
バージョン10iです。

自分で検証ができなくて困ってます。
一応書いてみましたが
SQL文ではできてもPL/SQLでできるかどうかデータがなくて試しができませんでした。

PROCEDURE add_AAA
IS
BEGIN
INSERT INTO AAA(
kaishacd,
naibu_no,
ap_zandk_kin,
kbn,
ichibu_kssai_fuka_flg,
koushin_user,
koushin_date)
(SELECT
pi_kaisha_cd,
AL001.naibu_no,
AL001.zan_kin,
'3',
AL001.ichibu_kssai_fuka_flg,
pi_userid,
pi_timestamp
FROM
BBB AL001
INNER JOIN CCC AL002 ON
AL001.kaishacd = AL002.kaishacd AND
AL001.sh_naibu_no = AL002.sh_naibu_no
WHERE
AL002.kaisha_cd = pi_kaisha_cd AND
AL002.sh_no = pi_sh_no);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
po_res_cd := C_RES_CD_DUPLICATE_ERR;
END add_AAA;

よろしくお願いします。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-04-11 15:32
回答ではありませんが、そんなややこしいSQLを書くぐらいなら、明示的にゴリゴリ書いた方が,わかり易いようなPL/SQlが使えればなおさらという気がする。
メンテナンスがやりにくいんだな、今はいいかもしれないけどさ
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-04-11 16:31
引用:

MUSEさんの書き込み (2006-04-11 14:35) より:
Oracleです。
バージョン10iです。


細かい突っ込みでごめんなさい。
Oracle10gですか?
それともOracle9iですか?
#10iって聞いたことがないので、10gの誤りか9iの誤りかが気になっただけです。

引用:

SQL文ではできてもPL/SQLでできるかどうかデータがなくて試しができませんでした。


MUSEさんがやりたいのは
SQLで済ませるのではなく、
ストアドプロシージャをつくり
そこでSELECTした結果を元にINSERTを行いたいのでしょうか?

引用:

データがなくて試しができませんでした


データを作ればいいじゃないですか?
って思うんですが。
データを入れることができない環境(本番機)などで
いきなりプロシージャを突っ込むとは思えないし・・・。
どんな状況かわかりませんが、DBAに頼んででもテスト環境をもらって
やってみたほうがいいかと思います。
未検証のものを入れることほど、怖いと思いますから。

で、プロシージャの中身を提示されても
テーブル定義もわかりませんし、私は検証のしようもないです。
#提示されても、今は検証できる環境にもいないのですが(^^;

プロシージャとしてではなく、PL/SQLブロックだけを抜き出し、
SELECTがうまくいくかをまず検証する。
その後にINSERTを追加して、意図したデータが登録されたかをチェックしたほうがいいかと思います。

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