【问题标题】:i cant update one table to another table in oracle 11g我无法在 oracle 11g 中将一个表更新为另一个表
【发布时间】:2018-02-13 08:01:37
【问题描述】:
UPDATE STOCKVALUE A 
     SET A.LOCATION=(SELECT B.LOCID FROM DCCUMINVBASIC B WHERE A.MAPNAME='invdc4')

错误:ORA-01427:单行子查询返回多行

【问题讨论】:

  • 错误信息很明确:有些情况下子查询返回了多条记录。因此,Oracle 无法确定 哪个 LOCID 值用于更新STOCKVALUE 表中的给定记录。
  • 您正在设置必须为 1 的 LOCATION。检查您的子查询,它返回多于 1 行 .. SELECT B.LOCID FROM DCCUMINVBASIC B WHERE A.MAPNAME='invdc4'
  • 我也给出了 Stockvalue 位置 ID(A.MAPNAME='invdc4' 和 a.location=10155000000024)
  • 更新 STOCKVALUE A SET A.LOCATION=(SELECT DISTINCT B.LOCID FROM STOCKVALUE A,DCCUMINVBASIC B WHERE A.DOCID=B.DOCID AND A.MAPNAME='invdc4'AND A.MPLANT 为 NULL )

标签: sql oracle oracle11g sql-update


【解决方案1】:

尝试执行这个查询(也可以使用DISTINCT):

SELECT B.LOCID FROM DCCUMINVBASIC B WHERE A.MAPNAME='invdc4'

你会看到错误是什么。

【讨论】:

    【解决方案2】:

    在这种情况下,最好通过提供多个结果来了解哪些行在此处导致问题。 要了解此处导致问题的行,您应该首先创建一个 select 语句,例如:

    SELECT (SELECT COUNT(*) FROM DCCUMINVBASIC B WHERE A.MAPNAME='invdc4') CNT FROM STOCKVALUE A;
    

    在这种情况下,检查计数大于 1 的行并在继续执行更新语句之前先修复选择。

    【讨论】:

    • OK 但是 DCCUMINVBASIC 表中有 4 个位置 ID 我想更新两个表中的库存表通常匹配 DOCID
    • 能否提供这两个表的 DDL 和一个示例数据集?
    【解决方案3】:

    在这个查询中

    (SELECT B.LOCID FROM DCCUMINVBASIC B WHERE A.MAPNAME='invdc4')
    

    您在表 B 上,并且试图在表 A 上创建条件。这没有任何意义。

    您的查询应如下所示:

    (SELECT B.LOCID FROM DCCUMINVBASIC B WHERE B.XXXX='yyyyy')
    

    它应该返回一个值(1 行 1 列结果)。

    【讨论】:

    • 我也给出了 Stockvalue 位置 ID(A.MAPNAME='invdc4' 和 a.location=10155000000024)
    【解决方案4】:

    错误代码抱怨的是查询

    从 DCCUMINVBASIC B 中选择 B.LOCID,其中 A.MAPNAME='invdc4'

    返回多于一行,因此外部查询无法执行,因为它需要一个值。

    【讨论】:

    • 我使用了不同但相同的错误
    • 更新 STOCKVALUE A SET A.LOCATION=(SELECT DISTINCT B.LOCID FROM STOCKVALUE A,DCCUMINVBASIC B WHERE A.DOCID=B.DOCID AND A.MAPNAME='invdc4'AND A.MPLANT 为 NULL )
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2013-08-22
    • 2012-04-07
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多