【问题标题】:Oracle SQL error - Single-row subquery returns more than one rowOracle SQL 错误 - 单行子查询返回多于一行
【发布时间】:2016-03-11 10:16:28
【问题描述】:
    UPDATE Table_A
SET Column_A = 
(SELECT Table_C.Column_C
FROM
    Table_A
INNER JOIN  
    Table_B
ON
    Table_A.Column_A1 = Table_B.Column_B
INNER JOIN
    Table_C
ON
    Table_B.Column_B1 = Table_C.Column_C1
WHERE
   Table_C.Column_C2 <> 'T' and 
   Table_C.Column_C3 = 'T' and 
   Table_B.Column_B2 = 'T' and Table_B.Column_B3 = 'xyz');

括号中有一个子查询,返回 10 个值,我想用这些值更新 Table_A。 但是更新语句只希望从子查询返回一个值:

ORA-01427: 单行子查询返回多于一行

我怎样才能更新多行而不是只更新一行?

我在此错误上看到的任何线程都无助于解决问题。

已编辑 - 有没有办法使用循环来做到这一点?

【问题讨论】:

  • 首先,是SQL server 还是Oracle?其次,请举例说明您的数据(最好是表和插入的 DDL 和 DML 语句)以及您的预期输出示例。
  • 也请发表您的完整声明
  • 很难说没有看到更新语句是什么。但是,如果您希望子查询中有不止一行,则使用“IN”而不是“=”
  • 删除了sql-server标签,因为错误信息清楚地表明了Oracle
  • 编辑了更详细的代码。是的,这是甲骨文。

标签: sql oracle sql-update


【解决方案1】:

你需要correlate子查询到主查询中的行:

UPDATE Table_A a
SET Column_A = 
(SELECT Table_C.Column_C
FROM
    Table_A
INNER JOIN  
    Table_B
ON
    Table_A.Column_A1 = Table_B.Column_B
INNER JOIN
    Table_C
ON
    Table_B.Column_B1 = Table_C.Column_C1
WHERE
   Table_C.Column_C2 <> 'T' and 
   Table_C.Column_C3 = 'T' and 
   Table_B.Column_B2 = 'T' and Table_B.Column_B3 = 'xyz'
   AND a.PKCOLS=Table_A.PKCOLS);

(“PKCOLS”是 Table_A 的主键的任何列。)

如果相关子查询仍然返回多行,那么您将需要确定您想要返回的多个行中的哪一个并添加一些内容以便只返回一个 - 例如创建日期最高的那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多