格式错误的 SQL 语句:预期的标记 'USING' 但找到了值为 't' 的标识符

Malformed SQL Statement: Expected token 'USING' but found Identifier with value 't' instead

我正在尝试使用 Databricks 中的以下代码与 pyspark

合并到 SQL 数据库
query = """
    MERGE INTO deltadf t
    USING df s
    ON s.SLAId_Id = t.SLAId_Id
    WHEN MATCHED THEN UPDATE SET *
    WHEN NOT MATCHED THEN INSERT *
  """
driver_manager = spark._sc._gateway.jvm.java.sql.DriverManager
con = driver_manager.getConnection(url) #
stmt = con.createStatement()
stmt.executeUpdate(query)
stmt.close()

但我收到以下错误:

SQLException: Malformed SQL Statement: Expected token 'USING' but found Identifier with value 't' instead at position 25.

有什么地方可能出错的想法吗?

SQLException: Malformed SQL Statement: Expected token 'USING' but found Identifier with value 't' instead at position 25.

如果您错过更新任何特定字段或特定语法,您将收到此错误。

我执行了 merge operation 它对我来说工作正常没有错误,请按照下面的参考。

参考:

https://www.youtube.com/watch?v=i5oM2bUyH0o

https://docs.databricks.com/delta/delta-update.html#upsert-into-a-table-using-merge

https://www.sqlshack.com/sql-server-merge-statement-overview-and-examples/

我不知道你为什么会收到这个确切的错误。但是,我认为您尝试做的事情存在很多问题。

运行 通过 JDBC 的查询使其仅在 SQL 服务器中成为 运行。像 WHEN MATCHED THEN UPDATE SET * / WHEN NOT MATCHED INSERT * 这样的构造将不起作用。 Databricks 接受它,但对于 SQL 服务器,您需要明确提供要更新的列和要插入的值 (reference)。

此外,您实际上在 SQL 服务器中有名为 deltadfdf 的表吗?我想你有一个名为 df 的 Dataframe 或临时视图......这将不起作用。如前所述,此查询仅在 SQL 服务器中执行。如果您想从 Dataframe 上传数据,请使用 df.write.format("jdbc").save (reference).

参见 this Fiddle - 如果 deltadfdf 是表,运行 在 SQL 服务器(任何版本)中执行此查询只会抱怨Incorrect syntax near '*'.