0

空のテーブルがあり、行が存在しない場合は挿入したいと考えています。ステートメントの 3 つの (主要な) バリエーションを試しました。1 つ目は機能し、2 つ目はエラーは発生しませんが何も挿入されず、3 つ目はエラーがスローされます。

2 番目のステートメントが何もしない理由を理解したいと思います。

最初は(挿入します):

MERGE INTO tags ta USING
 (VALUES 91852, 'G') temp (fid, tag) 
 ON temp.fid = ta.fid
 WHEN NOT MATCHED THEN
 INSERT (fid, tag) VALUES (temp.fid, temp.tag);

2 番目は (挿入しない):

MERGE INTO tags ta USING
 (SELECT fid, tag FROM tags i WHERE i.fid=91852 AND i.tag='G') temp (fid, tag) 
 ON temp.fid = ta.fid
 WHEN NOT MATCHED THEN
 INSERT (fid, tag) VALUES (91852, 'G');

SELECT が何も返さない場合、NOT MATCHED ステートメントが起動するはずですよね?

3番目は(エラーあり):

sql> MERGE INTO tags ta USING
 (SELECT fid, tag FROM tags i WHERE i.fid=91852 AND i.tag='G') temp (fid, tag) 
 ON temp.fid = ta.fid
 WHEN NOT MATCHED BY temp THEN
 INSERT (fid, tag) VALUES (91852, 'G');

  +>   +>   +>   +> SEVERE  SQL Error at '<stdin>' line 183:
"MERGE INTO tags ta USING
 (SELECT fid, tag FROM tags i WHERE i.fid=91852 AND i.tag='G') temp (fid, tag) 
 ON temp.fid = ta.fid
 WHEN NOT MATCHED BY temp THEN
 INSERT (fid, tag) VALUES (91852, 'G')"
unexpected token: BY required: THEN : line: 4
sql> sql> 

最後のバージョンはhttps://stackoverflow.com/a/30938729/4142984に触発されたもので、これは hsqldb ではなく sql-server 用です。

4

1 に答える 1

1

マージ ステートメントの SELECT 部分は、ソース セットです。空の場合、一致するものがないため、何も挿入されません。空の結果セットしかありません。

一般に、MERGE は USING 句によって取得された結果セットを取得し、それを ON 条件と結合します。次に、両方の可能性に対して何をすべきかを伝えることができます。条件に一致する場合はレコードを更新でき、一致しない場合はレコードを挿入できます。更新または挿入するデータは USING 句から取得されるため、USING 結果セットが空の場合、一致するものも挿入するものもありません。

于 2016-02-04T14:11:01.173 に答える