具有更多表的递归 SQL
Posted
技术标签:
【中文标题】具有更多表的递归 SQL【英文标题】:Recursive SQL with more tables 【发布时间】:2012-12-18 18:21:12 【问题描述】:我有一个关于在下面描述的非常特殊的情况下使用递归 SQL 的问题。
我有一个带有 (ID, value) 架构的表 A 和这些示例行:
(1,1000) (2,800) (3,300) (4,600)我有一个带有 (ID, value) 架构的表 B 和这些示例行:
(1,600) (2,300) (3,400) (4,600) (5,600) (6,400)目的是我必须从 A 中选择最大 ID,从 B 中选择最大 ID,然后从 A 中的值中减去 B 中的值,并为像这样的任何操作生成一行。
最终结果应该是一个模式(ID-A, ID-B, subtraction-value),生成的行将是这些:
(1,1,600) 在 A.ID=1 中保持 400,在 B.ID=1 中保持 0 (1,2,300) 在 A.ID=1 中保持 100,在 B.ID=2 中保持 0 (1,3,100) 在 A.ID=1 中保持 0,在 B.ID=3 中保持 300 (2,3,300) 在 A.ID=2 中保持 500,在 B.ID=3 中保持 0 (2,4,500) 在 A.ID=2 中保持 0,在 B.ID=4 中保持 100 (3,4,100) 在 A.ID=3 中保持 200,在 B.ID=4 中保持 0 (3,5,200) 在 A.ID=3 中保持 0,在 B.ID=5 中保持 400 (4,5,400) 在 A.ID=4 中保持 200,在 B.ID=5 中保持 0 (4,6,200) 在 A.ID=4 中保持 0,在 B.ID=6 中保持 200此时其中一张表中的行已完成,我需要停下来!
我不知道递归 SQL 是否可行,当然我认为我必须合并表 A 和 B 以生成一个固定表,我可以在该表上进行计算并生成我上面解释的内容,但我不知道如何管理我不知道先验的其余部分,例如时间 t 的值取决于 t-1 发生的情况)。
您有什么建议,一些链接可以帮助我了解是否可以使用递归 SQL 来管理这个问题?
提前非常感谢您。
【问题讨论】:
你用的是什么 rdbms? 我认为您正在寻找的可以通过 A 和 B 之间的 SELECT 和 JOINS 来实现。但结果集计算对我来说并不清楚。你能用更数学的方式表达结果吗?例如(Id A, Id B, MAX(A Value)-Max(B Values) *??) 假设表 A 是源,表 B 是我必须减去 A 的值。在每一步我都会考虑 A 中具有最高 ID 和值 > 0 的行中的值并从 B 中具有最高 ID AMD 值 > 0 的行中获取值。此时,我从 A 中的值中减去 B 中的值(或其中的一部分,见下文)。正如您在上面的示例中看到的,如果 B.valueA.value 那么我将 A.value 设置为0 和 B.value 将是 B.value-A.value,剩下的部分将在接下来的步骤中考虑。 @brokenp87 。 . .您的描述说max
,但该示例在ID 上使用min
。您正在执行一个贪心算法将“B”值分配到“A”桶中。有趣的问题。可能有一个迭代解决方案。
是的,你是对的,我被升序弄糊涂了……对不起……
【参考方案1】:
这个过程本质上没有递归。它被描述为一个迭代过程,它是一个迭代过程。
您将 B 值按顺序分配给 A,但要遵守一个简单的条件:B 的总和不超过每个桶中的 A 值。您可以使用光标来执行此操作,方法是在 A 和 B 上设置单独的光标。然后根据这个简单的规则继续进行分配。
我想不出在 SQL 中使用集合逻辑的方法。但是,使用游标的迭代方法可能是您的最佳解决方案。
【讨论】:
以上是关于具有更多表的递归 SQL的主要内容,如果未能解决你的问题,请参考以下文章