理解 MERGE INTO 与 hsqldb
Understanding MERGE INTO with hsqldb
我有一个空的 table 并且想插入一些行(如果尚不存在)。我尝试了 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 returns 什么都没有,那么应该触发 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>
最后一个版本的灵感来自 ,它适用于 sql-server,不适用于 hsqldb.
合并语句的 SELECT 部分是您的源集。如果为空,则不会插入任何内容,因为没有可匹配的内容。您只有一个空结果集。
一般来说,MERGE 获取 USING 子句获取的结果集,并将其与 ON 条件结合起来。然后你可以告诉你如何处理这两种可能性。如果符合条件,您可以更新记录,如果不匹配,则可以插入一个。
要更新或插入的数据来自 USING 子句,因此如果您的 USING 结果集为空,则您没有可匹配的内容,也没有可插入的内容。
我有一个空的 table 并且想插入一些行(如果尚不存在)。我尝试了 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 returns 什么都没有,那么应该触发 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>
最后一个版本的灵感来自
合并语句的 SELECT 部分是您的源集。如果为空,则不会插入任何内容,因为没有可匹配的内容。您只有一个空结果集。
一般来说,MERGE 获取 USING 子句获取的结果集,并将其与 ON 条件结合起来。然后你可以告诉你如何处理这两种可能性。如果符合条件,您可以更新记录,如果不匹配,则可以插入一个。 要更新或插入的数据来自 USING 子句,因此如果您的 USING 结果集为空,则您没有可匹配的内容,也没有可插入的内容。