如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束

Posted

技术标签:

【中文标题】如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束【英文标题】:How to UPDATE one column using another column in another table? SQL Error: ORA-00933: SQL command not properly ended 【发布时间】:2012-01-29 03:45:29 【问题描述】:

我已经尝试了所有我能想到的方法,但无法解决这个 SQL 错误:

SQL 错误:ORA-00933:SQL 命令未正确结束

这是 Oracle SQL。

    UPDATE SALES_DATA_FAMILY_2007 A 
    SET A.POG_ID=B.POG_ID 
    FROM POG_HIERARCHY B 
    WHERE A.FAMILY_ID=B.FAMILY ;

我尝试过的一种替代方法如下。不幸的是,它给出了另一个错误: ORA-01427: 单行子查询返回多于一行

    UPDATE SALES_DATA_FAMILY_2007 
    SET POG_ID= (SELECT POG_HIERARCHY.POG_ID FROM POG_HIERARCHY 
    WHERE SALES_DATA_FAMILY_2007.FAMILY_ID=POG_HIERARCHY.FAMILY_ID) 
    WHERE EXISTS (SELECT POG_HIERARCHY.POG_ID FROM POG_HIERARCHY 
    WHERE SALES_DATA_FAMILY_2007.FAMILY_ID=POG_HIERARCHY.FAMILY_ID) 
    ;

请帮忙!

【问题讨论】:

“ORA-01427:单行子查询返回多于一行”错误消息意味着有多个pog_hierarchy 记录具有相同的family_id。您需要告诉 Oracle 哪个 pog_hierarchy 记录是您想要的pog_id一个 【参考方案1】:

如果您想从包含多个记录的子查询中更新行,您可以使用合并命令:

merge into SALES_DATA_FAMILY_2007 A
using (select POG_ID , FAMILY
                 FROM POG_HIERARCHY ) B
on (A.FAMILY_ID=B.FAMILY)
when matched then
update set A.POG_ID=B.POG_ID

【讨论】:

非常感谢。这给了我错误:SQL 错误:ORA-00904: "B"."FAMILY": invalid identifier 00904. 00000 - "%s: invalid identifier"。现在我开始怀疑是否应该改用“插入”,但我只想更新一列... 抱歉忘记了“使用”内部选择中的 FAMILY,现在试试吧【参考方案2】:

试试这个:

UPDATE SALES_DATA_FAMILY_2007 A
SET A.POG_ID =
(   
  SELECT P.POG_ID 
  FROM POG_HIERARCHY P
  WHERE A.FAMILY_ID = P.FAMILY_ID 
)

【讨论】:

这与 OP 已经尝试过的有什么不同?如果 OP 的语句返回“ORA-01427:单行子查询返回多于一行”,那么您的语句也会如此。没有? 对,这给出了错误:ORA-01427:单行子查询返回多于一行 如果是这种情况,您需要弄清楚您到底要做什么。对于给定的 FAMILY_ID,POG_HEIRARCHY 中有多个 POG_ID,因此您必须决定使用哪个 POG_ID 并相应地更改内部查询,以便只返回一行。例如,如果您想使用最大的 POG_ID,请将内部查询更改为 SELECT MAX(P.POG_ID),它应该可以工作。【参考方案3】:
UPDATE SALES_DATA_FAMILY_2007 A 
SET A.POG_ID= (select B.POG_ID 
                 FROM POG_HIERARCHY B  
                WHERE A.FAMILY_ID=B.FAMILY) ;

当且仅当给定 FAMILY 的 POD_HIERARCHY 中最多有一个对应行时,这才有效。如果 POD_HIERARCHY 中有不止一行,那么您需要确定您希望使用 POD_HIERARCHY 中哪一行的值。

【讨论】:

【参考方案4】:
UPDATE SALES_DATA_FAMILY_2007 A 
SET A.POG_ID= (select B.POG_ID 
                 FROM POG_HIERARCHY B  
                WHERE A.FAMILY_ID=B.FAMILY)
WHERE A.POG_ID IN (SELECT C.POG_ID FROM POG_HIERARCHY C
                   WHERE A.FAMILY_ID = C.FAMILY);

【讨论】:

以上是关于如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束的主要内容,如果未能解决你的问题,请参考以下文章

如何用另一个表中的另一列替换一列数据?

当用户在 MS Access 中修改表中的另一列时,如何在 SQL Server 中将列设置为今天的日期 [关闭]

转换后将数据从一列复制到同一表中的另一列

表中的一列引用 SQL 中存在重复数据的另一列

GROUP BY 一列但不是同一表中的另一列-SQL [重复]

sql怎么把一个表的一列替换到对应的另一个表中对应的列?