- - PR -
SQLを一つにしたい
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-10-30 11:21
こんにちは。
新規追加・更新のレコードが含まれたテーブルを各1つずつのSQLで取っていたのを つなげて1回の実行で処理したいのですが、どうすればいいのでしょうか? 取得カラムは同じです。 1.Select A.* from A where A.id not in (select B.id from B) //Insert 2.Select A.* from A, B where A.id = B.id and (A.no <> B.no or A.level <> B.level)//update こんな感じのSQLですが、よろしくお願いします。 | ||||
|
投稿日時: 2007-10-30 11:33
環境ぐらい書いたほうがいいと思います。
OracleだったらMERGE文でできそうです。 MERGE - Oracle SQL 入門 http://biz.rivus.jp/sql/merge.html | ||||
|
投稿日時: 2007-10-30 11:49
ありがとうございます。
すいません、書き忘れました環境面ですが、Oracle10gです。 ただ、他DB対応も兼ねているので、ネイティブ(←こう言うのでしょうか?)なSQLで一般的に利用できればありがたいのですが・・。 よろしくお願いします。 | ||||
|
投稿日時: 2007-10-30 12:03
UNION または UNION ALL
Select A.* from A where A.id not in (select B.id from B) //Insert UNION ALL Select A.* from A, B where A.id = B.id and (A.no <> B.no or A.level <> B.level)//update | ||||
|
投稿日時: 2007-10-30 12:05
質問の意図するところが、追加と更新を1回の処理で同時に行うのか・追加と更新を
それぞれ1回の処理で行うのかが判りません。 あと使用しているデータベースとバージョン及びSQLの全文を、挙げて頂けると解答も 挙げやすいかと思います。 1.追加と更新を1回の処理で同時に行う 追加と更新を1度に行う事が出来るのは(私の知るところ)、OracleのMERGE処理以外 思いつきませんが、見たところWHERE句以下の条件が異なっている為、無理でしょう。 2.追加を(まとめて)1回・更新を(まとめて)1回の処理で行う 追加はとても一般的な処理となります。 INSERT INTO 対象テーブル名 ( フィールド,・・・・・ ) SELECT * FROM A WHERE ID NOT IN ( SELECT ID FROM B ) ↑ INSERTのフィールド順序とAテーブルのフィールド順序及びフィールド個数を きちんと揃えてください。 更新はフィールドの構成により可能か不可能かが分かれます。 又、データベースによって可能か不可能化が分かれます。 ケース1(更新対象はAテーブルの主キーで検索可能且つ更新値は固定値) UPDATE 更新対象テーブル SET 更新対象テーブル.更新対象フィールド = 固定値 WHERE 更新対象テーブル.主キー IN ( SELECT 主キー FROM A, B WHERE A.id = B.id AND ( A.No <> B.No OR A.Level <> B.Level ) ) ↑ 主キーの数が一個でないと実現出来ない可能性があります。 主キーが一個でない場合は値を連結して下さい。 更新値がAテーブルのフィールドであれば、PostgreSQL以外は判りませんが 下記のようになります。 ケース2(Aテーブルの主キーで検索可能且つ更新値はAテーブルの値) 以下PostgreSQLのみ(Accessでも可能かもしれません) UPDATE 更新対象テーブル SET 更新対象テーブル.更新対象フィールド = A.更新値 FROM A,B WHERE 更新対象テーブル.主キー = A.主キー AND A.id = B.id AND ( A.No <> B.No OR A.Level <> B.Level ) ↑ UPDATEでFROMが使用できるデータベースは、そんなに存在しません。 主キーの数が一個でないと実現出来ない可能性があります。 主キーが一個でない場合は値を連結して下さい。 | ||||
|
投稿日時: 2007-10-30 12:40
横道です。
「ネイティブなSQL」と言うと「あるDBに特有の方言も含む」です。 普通に日本語で「標準的なSQL」とでも言えばよろしいです。英語がよければ「ジェネリックな」とか「スタンダードな」とか。 | ||||
|
投稿日時: 2007-10-30 14:33
ありがとうございます。
UNION ALLですね。 ありがとうございました。 | ||||
|
投稿日時: 2007-10-30 14:34
一般的なSQlでやりたいのなら なおさらややこしいことをせずに、
同一トランザクションで、2回にわけてするけどなぁ |