我在连接 2 个表后创建了一个表,它生成了一个递归表。现在我想添加一个额外的列CalculatedDiscount,并在较低组为空时从高到低填充空折扣。所以我的想法,理论上是从当前组往上看:看父组:有值:是的,CalculatedDiscount设置为他的折扣。如果不是:查看他的父组,依此类推,直到位于或不位于基组。
我期望的是计算栏填满家长折扣。
ID 和 ParentID 给出了分层数据结构。有关代码和进一步的解释,请查看小提琴:https://dbfiddle.uk/cnSow2zY
当重新思考这个问题时,我想出了以下方法:
在查询的递归部分遍历父级时,当父级的discountpercentage不为Null时需要停止,因此在检查cte.discountPercentage时设置“where”(因此它仍在寻找一个值,除非已经找到了一个值)上一次迭代中的值)。这将导致一个看起来残酷的表,结果行具有相同的 ID,但父组的名称,这是故意这样做的,因为:
现在我们可以使用内部连接将生成的 cte 自身连接起来,以查找该“group.ID”的下一个 id 的折扣百分比具有 NOT NULL 值(但要小心,如果直到 rootnode 才找到,它将不会返回任何内容)因此,设置 OR ParentID = 0) 将该结果改写为 CASE 语句,以检查 DiscountPercentage 是否已填充:如果没有:获取 selfJoinedTable.discountPercentage(因此 ID 为 nextID),否则:设置为 null AScalculatedPercentage。
这听起来可能有点令人困惑或复杂,但在此 dbfiddle 中可以找到概述/解释:https://dbfiddle.uk/kvJ8rIGX