【问题标题】:update multiple tables considering columns to update are in "where"考虑要更新的列在“where”中更新多个表
【发布时间】:2016-01-25 01:50:58
【问题描述】:

有 3 个表 - 1 个父级和 2 个子级(子 PK 对父 PK 具有 FK) 我需要更新所有 3 个表中的一些列,其中一个“位置”取决于更新列。因此,在一个事务中将有 3 个更新语句,但第一个更新更改列并且“位置”被篡改(对于最后两个更新)。 有没有解决这个问题的通用方法?

比如有表

figure(id, name) -- parent table
shape(id, shape) -- shape.id reference to figure.id
color(id, color) -- color.id reference to figure.id

我想将红色矩形更新为绿色方块,这意味着:

UPDATE shape SET shape.shape = 'square' 
   WHERE shape.id = (SELECT id FROM shape
                        INNER JOIN color ON color.id = shape.id
                        WHERE shape.shape ='rectangle'
                              AND color.color = 'red');

UPDATE color SET color.color = 'green' 
   WHERE color.id = (SELECT id FROM shape
                        INNER JOIN color ON color.id = shape.id
                        WHERE shape.shape ='rectangle'
                              AND color.color = 'red');

但在第一次更新后没有任何“红色矩形”,因为它们变成了“方形”

所以,问题是:我是否必须创建一个临时表来选择 ids 并执行更新,还是有其他常见的方法?

【问题讨论】:

  • 一点都不清楚,给我们表结构,输入和想要的输出
  • 添加到@sagi sais 的内容:在您的问题中包含您的查询并使用代码示例按钮{}正确格式化它们
  • “我是否必须创建一个临时表来选择 id 并执行更新” > 。您希望我在答案中输入这是如何完成的,还是您可以自己解决?
  • 您使用的是哪个 DBMS?

标签: sql sql-update


【解决方案1】:

类似这样的:

SELECT DISTINCT shape.id
INTO #tempIds
FROM shape
INNER JOIN color ON color.id = shape.id
WHERE shape.shape ='rectangle'
  AND color.color = 'red'
;

UPDATE shape SET shape.shape = 'square' 
WHERE shape.id IN (SELECT id FROM #tempIds)
;

UPDATE color SET color.color = 'green' 
WHERE color.id = (SELECT id FROM #tempIds)
;

可能也想围绕这个抛出事务和错误处理。

【讨论】:

  • 感谢您的回复,但这是我想知道的 - 这是解决此类问题的唯一/正确方法吗?
  • @ValK 不,这不是唯一的方法。您可以在不同的情况下使用许多越来越复杂的方法。我相信这是最简单的方法,除非我有其他信息或上下文会使这种方法不受欢迎,否则我会使用这种方法。这是解决它的常用方法。
  • @@RBarry Young 我浪费了几个小时试图找到有关此问题的任何信息,但我找不到! (只有琐碎的例子)。我知道 VIEW 和触发器/规则/存储过程,但我想知道规范化数据库的“无触发器”解决方案。你打消了我的疑虑,谢谢!
  • @ValK 您也可以通过向其中一个表添加“flag”列的标记来做到这一点,但是您必须更改表定义,它仍然需要三个语句。
猜你喜欢
  • 2012-12-29
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多