使用 hsqldb 了解 MERGE INTO
Posted
技术标签:
【中文标题】使用 hsqldb 了解 MERGE INTO【英文标题】:Understanding MERGE INTO with hsqldb 【发布时间】:2016-02-04 13:45:01 【问题描述】:我有一个空表,如果它不存在,我想插入一些行。我尝试了 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://***.com/a/30938729/4142984,它是用于 sql-server,而不是用于 hsqldb。
【问题讨论】:
【参考方案1】:合并语句的 SELECT 部分是您的源集。如果它为空,则不会插入任何内容,因为没有可匹配的内容。您只有一个空结果集。
一般来说,MERGE 获取您的 USING 子句获取的结果集并将其与您的 ON 条件连接。然后你可以告诉这两种可能性该怎么做。如果它符合条件,您可以更新记录,否则您可以插入一条。 要更新或插入的数据来自 USING 子句,因此如果您的 USING 结果集为空,则您没有任何内容可以匹配,也没有任何内容可以插入。
【讨论】:
我不确定我是否理解正确。为什么会在这里看到***.com/a/30938729/4142984“选择null 作为test1”工作?因为有一行(尽管为空)而不是我的示例,所以根本没有行? 嗯,可能是这样。在我看来,这就像一个边缘案例。我真的不知道 hsqldb,我不得不承认。但是,是的,SELECT NULL ... 和空结果集之间还是有区别的。 答案是正确的。如果源行集不包含任何行,则不执行任何操作。以上是关于使用 hsqldb 了解 MERGE INTO的主要内容,如果未能解决你的问题,请参考以下文章
HSQLDB:REPLACE INTO 表抛出 org.hsqldb.HsqlException:完整性约束违规:
HSQLDB: INSERT INTO ... (SELECT NULL, * FROM) 导致“列名重复”