我有一个表用于建模继承关系。它是面向列的,所以有所有属性的列,看起来像:
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引擎)
答案 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