【发布时间】:2017-01-27 12:05:03
【问题描述】:
想象以下场景: 我有很多级别,从上级(根父级)到下级(子级或叶子)。
(root parent) LEVEL 0
ID:98
/ \
/ \
/ \
o + LEVEL 1
ID:99 ID:100
/ \
/ \
o + LEVEL 2
ID:101 ID:102
/ \
/ \
o o LEVEL 3
ID:201 ID:202
现在想象一下,“+”符号是房间。同层的房间之间无法通信。每个房间都有一些大门。通过这些门,您可以与下一层的其他房间(孩子)交流。
符号“o”是叶子,我的意思是,房间没有门可以进入较低级别的其他房间。
这里为了简单起见,每个房间都有两个大门,但也可以有两个以上。
所以现在,最后想象一下:如果爆炸起源于属于父房间的任何子房间/叶子房间,那么父房间的所有门都将自动关闭,以防止爆炸传播到根父房间。
想象一下下表:
ROOM_ID | PARENT_ROOM | GATES_OPEN | EXPLOSION
98 NULL 1 0
99 98 1 0
100 98 1 0
102 100 1 0
101 100 1 0
200 102 - 0
201 102 - 0
所有房间的所有大门都打开,因为最初没有爆炸。 房间 200 和 201 没有大门。
假设每个房间都有一个传感器来检测可能发生的爆炸。如果传感器检测到爆炸,则信号会传播到父房间,父房间会关闭所有大门。该信号也向上传播到父房间,所有父房间也关闭其所有门,依此类推,直到到达根父房间,它也关闭所有门。
所以现在假设房间 ID:102 发生爆炸,所以我需要更新下表:
ROOM_ID | PARENT_ROOM | GATES_OPEN | EXPLOSION
98 NULL 0 0
99 98 1 0
100 98 0 0
102 100 1 1
101 100 1 0
200 102 - 0
201 102 - 0
那么使用递归CTE,如何从初始表中获取更新后的最终表呢?我需要将它从引起爆炸的根传播到根父级。
【问题讨论】:
标签: sql-server sql-server-2008 recursion sql-server-2008-r2 common-table-expression