Sql 使用返回多行的子查询更新行

Sql 使用返回多行的子查询更新行,sql,oracle,Sql,Oracle,使用子查询更新表时出错,该子查询不应包含多个值,但确实包含多个值 查询: UPDATE @Table1 SET D = t2.D + t3.D FROM @Table1 t1 INNER JOIN @Table2 t2 ON t1.P = t2.P INNER JOIN @Table3 t3 ON t1.A = t3.A 我不了解Oracle,但我知道在SQL Server中,除非您愿意动态构建SQL字符串并执行它,否则无法将表名作为参数传递 希望Oracle用户能够

使用子查询更新表时出错,该子查询不应包含多个值,但确实包含多个值

查询:

UPDATE @Table1 SET D = t2.D + t3.D 
FROM @Table1 t1 
INNER JOIN @Table2 t2 ON 
    t1.P = t2.P 
INNER JOIN @Table3 t3 ON 
    t1.A = t3.A

我不了解Oracle,但我知道在SQL Server中,除非您愿意动态构建SQL字符串并执行它,否则无法将表名作为参数传递


希望Oracle用户能够确认Oracle是否可以这样做。

您应该在UPDATE子句中使用@Table1的别名-这可能是您的问题。像这样:

UPDATE t1 SET D = t2.D + t3.D 
FROM @Table1 t1 
INNER JOIN @Table2 t2 ON 
    t1.P = t2.P 
INNER JOIN @Table3 t3 ON 
    t1.A = t3.A
这将更加稳定,因为它会意识到您在FROM子句中没有将其视为一个单独的表

事实上,当您还有FROM子句时,只在UPDATE子句中使用别名是一个非常好的实践


Rob

在Oracle上,您可以将只返回一行(标量子查询)的查询括在括号中,并像使用变量/列一样使用它们:

UPDATE Table1 t1
SET D = (SELECT t2.D + t3.D 
         FROM Table2 t2
             ,Table3 t3
         WHERE t1.P = t2.P 
           AND t1.A = t3.A);
如果子查询返回多行,您可能希望在子查询中使用SUM()。 编辑:如果不在子查询中联接表,则可能应该使用两个子查询

UPDATE Table1 t1
SET D = (SELECT sum(t2.D) 
         FROM Table2 t2
         WHERE t1.P = t2.P)
        +
        (SELECT sum(t3.D)
         FROM Table3 t3
         WHEREt1.A = t3.A)

编写准确的查询可能有助于理解您的问题并提供替代解决方案。您能否至少提供您的平台?这方面的修复会有相当大的不同。请告诉我们DB是什么,并给我们一段代码来处理..更新@Table1 SET D=t2.D+t3.D,从t1上的@Table1 t1 internal JOIN@Table2 t2.P=t2.P internal JOIN@Table3 t3 t1.A=t3.A我正在使用oracle….在更新我尝试使用的表之前子查询返回什么但是当我使用子查询更新它的抛出错误时,你能解释一下sum的用法吗?sum保证你只得到一行。