java - SQL MERGE 将值更新或插入到同一个表中

标签 java sql oracle jdbc merge

"MERGE INTO NT_PROPERTY ntProp USING ( "  +
                            "SELECT * FROM NT_PROPERTY ) " +
                            "VALUES " +
                                    "('minDPTObjectId'," + minDPTObjectId + ", 'Starting DPT Object Id') " +
                                    "('maxDPTObjectId', " + maxDPTObjectId + ", 'Ending DPT Object Id') " +
                            "vt (NAME, VALUE, NOTE) " +
                            "ON ( ntProp.NAME = vt.NAME ) " +
                            "WHEN MATCHED THEN " +
                            "UPDATE SET VALUE = vt.VALUE "+
                            "WHEN NOT MATCHED THEN " +
                            "INSERT (NAME, VALUE, NOTE) VALUES (vt.NAME, vt.VALUE, vt.NOTE)";

好吧,我遇到了一个缺少 ON 关键字的错误,并且完全不知道这是怎么回事,还有没有其他方法可以让它不那么笨拙

非常感谢您的帮助。

最佳答案

问题是您的 MERGE 语法不正确。您的陈述采用以下形式:

MERGE INTO nt_property ntprop
  USING (SELECT * FROM nt_property)
    VALUES (...)
    vt (...)
  ON (ntprop.name = vt.name)
WHEN MATCHED THEN
  UPDATE ...
WHEN NOT MATCHED THEN
  INSERT ...;

但它应该是这样的形式:

MERGE INTO target_table tgt_alias
  USING source_table_or_subquery src_alias
    ON (<JOIN conditions>)
WHEN MATCHED THEN
  UPDATE ...
WHEN NOT MATCHED THEN
  INSERT ...;

为什么在 usingon 子句之间有 VALUESvt 子句?那是不正确的语法。此外,虽然您可以在 using 子句中使用 select * from tablename,但您可以直接使用 tablename,因为您要选择所有列和所有行。

关于java - SQL MERGE 将值更新或插入到同一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43908427/

相关文章:

java - Jenkins - 如何将字符串从全局配置传递到作业配置

java - 使用 any() 或 anyList() 时,使用 ArrayList/List 参数清除方法失败

java - JTextPane 阻止在父 JScrollPane 中滚动

java - 私有(private)字段是否被子类继承?

MySQL统计用户在网站上花费的时间

oracle - SQL*Plus - 如何隐藏 SET ECHO OFF?

php - 如何将原始 SQL 查询转换为 Silverstripe SQLQuery 抽象层

sql - 从两个 XML 列中选择并匹配值

sql - Oracle SQL NOT NULL x或NULL?

sql - ORA 7445 : Query causing Oracle 12c to crash