【问题标题】:Oracle SQL update from one Table to another table throws syntax error从一个表到另一个表的 Oracle SQL 更新引发语法错误
【发布时间】:2026-01-07 00:45:01
【问题描述】:

从一个表到另一个表的 Oracle SQL 更新会引发以下简单更新查询的语法错误。

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 

错误:

Error starting at line 1 in command:
Error at Command Line:2 Column:37
Error report:
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"

我相信同样的查询也适用于其他数据库,如 postgres 等。

谁能说出正确的查询?

无论我尝试的是这个 ANSI 标准查询吗?

【问题讨论】:

  • 为什么有多个数据库产品标签?这个问题与 teradata 以外的 Oracle 或 mysql 或等等等等有什么关系?
  • @LalitKumarB:我标记了其他数据库,因为我需要其他数据库通用的 ansi 标准查询..你将如何在 ANSI 格式的 oracle 中实现这一点?这同样适用于 teradata
  • @LalitKumarB :在 oracle 中执行后,我改变了我的问题。它抛出同样的错误。我也更新了这个关于 oracle 的问题,以便每个人都可以看看它......
  • 不,这不是标准 SQL。 ANSI SQL 不允许在UPDATE(或DELETE)语句中使用任何连接。
  • UPDATE (SELECT table1.accountno as OLD, table2.accountno as NEW FROM table1 INNER JOIN table2 ON table1.LeadID = table2.LeadID ) temp SET temp.OLD = temp.NEW 使用 Inner Join 试试这个

标签: sql oracle


【解决方案1】:

无论我尝试的是这个 ANSI 标准查询吗?

没有。 Oracle Oracle 不支持加入更新语句。

在 Oracle 中,您可以通过两种方式实现 -

**合并语句**

合并语句中只有更新子句

MERGE INTO sales_import s   
USING (SELECT * 
       FROM   retrieveaccountnumber) u 
ON (u.leadid = s.leadid) 
WHEN matched THEN 
  UPDATE SET u.accountnumber = s.accountnumber; 

相关查询

UPDATE sales_import t1
   SET accountnumber  = (SELECT t2.accountnumber  
                         FROM retrieveaccountnumber t2
                        WHERE t1.leadid = t2.leadid )
 WHERE EXISTS (
    SELECT 1
      FROM retrieveaccountnumber t2
     WHERE t1.leadid = t2.leadid );

【讨论】:

  • 谢谢。内连接怎么样?
  • Oracle 不支持直接加入更新语句。您可以使用合并或相关查询。您也可以使用内联视图,让我也将其添加到答案中。
  • 如果在相关查询中不使用WHERE EXISTS 会怎样?剩下的查询也会给出相同的答案吗?
  • where exists 将限制不匹配的行。过滤谓词只考虑源表中存在其他表中的行的那些行。
  • 如果您删除 exits 子句,它将更新所有行。这不是你想要的,你只想更新那些匹配连接条件的行。
【解决方案2】:

我会这样写你的sql:

UPDATE Sales_Import SI
SET AccountNumber = (Select RAN.AccountNumber
                 FROM RetrieveAccountNumber RAN
                 WHERE RAN.LeadID = SI.LeadID); 

【讨论】:

  • 如果子查询返回多于一行就会失败。
  • @LalitKumarB:那怎么处理?我们如何限制多个值?您的回答也没有给出该选项
  • 限制值可以通过过滤器来完成。根据您的情况尝试使用更多过滤器。
  • 没有。添加过滤器不同于仅更新那些满足连接条件的行。您的查询将更新表 Sales_Import 中的所有行。但是,你不应该那样做。举个简单的例子,自己测试一下。
【解决方案3】:

您可以通过加入这些表来做到这一点:

UPDATE SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
JOIN Sales_Import SI ON RAN.LeadID = SI.LeadID;

【讨论】:

  • Error report: SQL Error: ORA-00933: SQL command not properly ended 00933. 00000 - "SQL command not properly ended"
  • 是的,对不起。这在甲骨文中行不通。似乎您不能通过加入 Oracle 来做到这一点。非常奇怪和丑陋..
  • Oracle 不支持加入更新语句。您可以使用 Merge,请参阅我的答案。
最近更新 更多