SQL更新表指的是它自己

时间:2018-02-15 23:08:12

标签: sql postgresql

我有一个表ProfileText,其中包含四列:Id, Text, State, PreviousText

State是一个包含以下状态的枚举:released, draft

PreviousText是对另一个ProfileText的引用。

每当创建新的ProfileText时,之前的ProfileText都会设置为PreviousTextState并不重要。这创造了一种发布和起草文本的“时间表”。现在我要修改PreviousText。 “时间轴”应仅包含State = released的条目。

旧示例:A(已发布) - > B(草案) - > C(已发布) - >空

示例新:A(已发布) - > C(已发布) - >空

如何在SQL中创建此更新表?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的目标,您应该能够通过使用递归CTE(公用表表达式)的更新来实现此目的:

this

这样做是它选择CTE的非递归部分中的所有“已发布”记录,而不管它们可能引用的先前记录的状态,然后对于任何未引用的先前记录的引用,它会产生额外的包含已发布条目的原始值并包含对前一条目的上一条目的引用的记录,一直持续到达到已发布的记录或空引用。

然后它所要做的就是更新表中新构造的时间轴中的所有条目,并且在时间轴中有一个空条目(当最早发布的条目不是最旧的条目时必需)或者有一个条目引用之前未在旧时间轴中反映的“已发布”记录。