- PR -

SQLを一つにしたい

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2007/09/29
投稿数: 78
投稿日時: 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ですが、よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-10-30 11:33
環境ぐらい書いたほうがいいと思います。

OracleだったらMERGE文でできそうです。

MERGE - Oracle SQL 入門
http://biz.rivus.jp/sql/merge.html
未記入
ベテラン
会議室デビュー日: 2007/09/29
投稿数: 78
投稿日時: 2007-10-30 11:49
ありがとうございます。

すいません、書き忘れました環境面ですが、Oracle10gです。
ただ、他DB対応も兼ねているので、ネイティブ(←こう言うのでしょうか?)なSQLで一般的に利用できればありがたいのですが・・。

よろしくお願いします。
chamaro
会議室デビュー日: 2002/07/28
投稿数: 10
投稿日時: 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
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 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が使用できるデータベースは、そんなに存在しません。
 主キーの数が一個でないと実現出来ない可能性があります。
 主キーが一個でない場合は値を連結して下さい。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-10-30 12:40
横道です。

引用:

未記入さんの書き込み (2007-10-30 11:49) より:
ただ、他DB対応も兼ねているので、ネイティブ(←こう言うのでしょうか?)なSQLで一般的に利用できればありがたいのですが・・。



「ネイティブなSQL」と言うと「あるDBに特有の方言も含む」です。
普通に日本語で「標準的なSQL」とでも言えばよろしいです。英語がよければ「ジェネリックな」とか「スタンダードな」とか。
未記入
ベテラン
会議室デビュー日: 2007/09/29
投稿数: 78
投稿日時: 2007-10-30 14:33
ありがとうございます。

UNION ALLですね。
ありがとうございました。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-10-30 14:34
一般的なSQlでやりたいのなら なおさらややこしいことをせずに、
同一トランザクションで、2回にわけてするけどなぁ 

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