使用hsqldb

时间:2016-02-04 13:45:01

标签: sql hsqldb sql-merge

我有一个空表,如果它不存在,我想插入一些行。我尝试了三种(主要)变体的陈述。第一个工作,第二个没有错误,但没有插入任何东西,第三个甚至抛出错误。

我想理解为什么第二个陈述没有做任何事情。

首先是(插入):

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。

1 个答案:

答案 0 :(得分:1)

合并语句的SELECT部分​​是您的源集。如果它是空的,则不会插入任何内容,因为没有任何内容可供匹配。你只有一个空的结果集。

通常,MERGE采用您的USING子句获取的结果集,并将其与ON条件连接。然后你就可以知道如何处理两种可能性。如果它符合条件,您可以更新记录,否则您可以插入一个。 要更新或插入的数据来自USING子句,因此如果您的USING结果集为空,则无需匹配任何内容,也无需插入任何内容。