基于继承的表中的UPDATE语句

时间:2017-07-25 20:22:53

标签: sql

我有一个表用于建模继承关系。它是面向列的,所以有所有属性的列,看起来像:

mainid, subid, prop1, prop2, etc.

具有相同mainid的所有行都是相关的,而具有subid = 0的任何行都是与mainid和subid>匹配的任何行的父行。 0.因此:

100, 0, 'abc', 123

100, 1, NULL, 456

表示(100,1)(100,0)的孩子,而prop1的{​​{1}}查询应该为(100,1)提供'abc'并查询prop2 (100,1)应该给我456

这似乎工作正常但是,当我想要更新(100,1).prop1时,如果更新值为NULL(我匹配parent.prop1),我想创建字段'abc'领域)。我可以为此做一个简单的更新查询吗?我意识到我可以通过多个查询执行此操作,但是如果可能的话,我希望一次更新查询并同时更新多个字段(eg update (100,1).prop1='abc', (100,1).prop2=789, etc.)

这适用于标准SQL(例如,不适用于任何特定的SQL引擎)

1 个答案:

答案 0 :(得分:1)

使用案例表达式和从属子查询,它们是标准ANSII SQL的一部分,几乎所有数据库都支持它们。:

UPDATE table t1
SET prop1 = CASE WHEN EXISTS 
                 ( SELECT * FROM table t2
                   WHERE t1.mainid = t2.mainid 
                     AND t2.subid = t1.subid - 1 
                     AND t2.prop1 = 'abc'
                 )
             THEN NULL ELSE 'abc' END
WHERE t1.mainid = 100 AND t1.subid = 1