空のテーブルがあり、行が存在しない場合は挿入したいと考えています。ステートメントの 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 用です。