【问题标题】:what is the right way to reduce multiple update statement in oracle在oracle中减少多个更新语句的正确方法是什么
【发布时间】:2015-10-22 15:50:08
【问题描述】:

我有 2 个表,其中一个列/字段在两个表中都相同,我需要使用表 B 中的数据更新表 A。 这里需要取表 A.x 值并与 B.w 进行比较,并且需要在 A.x 中更新等效的 B.z 值。 x 值与 x1,x2 等不同。因此需要取每个值并与表 B 中的 w 进行比较,并且需要在表 A 中的 x,x1,x2 等中更新等效的 z 值。

Table A  (columns j, x, x1,x2,x3..x20 and so on)
---------

j x x1 x2 ..x20 and y y1 y2 .. y20




Table B (columns w and z)
--------
w   z



UPDATE TableA a SET a.x = (SELECT b.w
        FROM TableB b
        WHERE a.x = b.z)
WHERE a.j='somevalue';

如果我这样写我需要写40个更新语句,有没有简单的方法来做这些更新。

子查询可能会返回多行,我也需要对其进行细化。

谢谢, 阿什拉夫

【问题讨论】:

  • 你是说你有一大堆列需要在表 A 和 B 中相同?
  • tableA 中的一堆列需要在参考表表 B 中进行比较。所以这里我将 A.x 与 B.w 进行比较,然后取参考值 B.z 并将其更新回 A.x.. 所以这里是 A.x, A. x1..A.x20 需要与表 B 中的参考值进行比较并更新回表中
  • 乍一看,这看起来像是一个糟糕的数据库设计。似乎 x1, x2, ... 最好是行而不是列。无论如何,x1、x2 等的更新会是什么样子。 完全和x一样,所以我只是把x换成x1等等?
  • 并且请显示在多行匹配的情况下选择哪条记录,正如您在最后一句中提到的那样。
  • 类似:set (x,y,z) = (select b.x, b.y, b.z from ....);

标签: sql oracle oracle11g


【解决方案1】:

由于 a.x 有另一个值,如 a.x1 和 a.x2 等。当然,每个值都需要一个子查询,因为您要查找的 b 记录不同。

UPDATE TableA a 
SET a.x = (SELECT b.w FROM TableB b WHERE a.x = b.z)
  , a.x1 = (SELECT b.w FROM TableB b WHERE a.x1 = b.z)
  , a.x2 = (SELECT b.w FROM TableB b WHERE a.x2 = b.z)
  ...
WHERE a.j = 'somevalue';

您可能需要考虑更改 tableA 的表格设计,以便让行而不是列来保存值。这将使更新(以及一般的查询)更容易。

【讨论】:

  • 谢谢! @ThorstenKettner
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多