我有一个空表,如果它不存在,我想插入一些行。我尝试了 3 种(主要)语句变体。第一个有效,第二个没有错误但不插入任何内容,第三个甚至抛出错误。
我想了解为什么第二个语句没有做任何事情。
首先是(插入):
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);
其次是(不插入):
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 语句应该触发,对吗?
第三是(有错误):
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,它适用于 sql-server,而不适用于 hsqldb。