【问题标题】:Nested sum loop until foreign key 'dies out'嵌套求和循环,直到外键“消失”
【发布时间】:2019-06-04 09:16:17
【问题描述】:

我正在尝试编写一个数据检索函数。本质上,此查询旨在对 Voorwerp_in_Rubriek 表中所有 voorwerpnummer 的计数进行求和,按从 Rubriek 收集的它们的 rubrieknummer 分组。
之后,我想继续循环遍历总和以到达他们的“顶级父级”。 Rubriek 有一个外键引用自身,带有一个 'hoofdrubriek',这更容易被视为它在类别树中的父级。
这也意味着它们可以嵌套。 hoofdcategory 列中的“NULL”值表示它是顶级父级。此查询背后的想法是对 Voorwerp_in_rubriek 中的 voorwerpnummer 计数进行求和,并将它们加在一起,直到它们处于“顶级父级”。
由于数据库和测试数据非常庞大,我决定不对这个问题添加直接代码,而是添加到 dbfiddle 的链接,这样结构就会更多。

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8068a52da6a29afffe6dc793398f0998

我使用这个查询在某种程度上让它工作了:

SELECT  R2.hoofdrubriek ,
        COUNT(Vr.rubrieknummer) AS aantal
FROM    Rubriek R1
        RIGHT OUTER JOIN Rubriek R2 ON R1.rubrieknummer = R2.hoofdrubriek
        INNER JOIN Voorwerp_in_rubriek Vr ON R2.rubrieknummer = Vr.rubrieknummer
WHERE   NOT EXISTS ( SELECT *
                     FROM   Rubriek
                     WHERE  hoofdrubriek = R2.rubrieknummer )
        AND R1.hoofdrubriek IS NOT NULL
GROUP BY Vr.rubrieknummer ,
        R2.hoofdrubriek

但一般来说,这并不能取回所有物品和翻牌。我希望有人可以帮助我。

【问题讨论】:

  • 你可以写一个递归查询来遍历你的记录树,见stackoverflow.com/questions/959804/… - 你基本上有一个WITH,它是两部分,用一个联合连接,一个引用起始条件(@ 987654325@) 和另一部分引用了一个将 cte 连接到自身的查询(从而建立递归)
  • @CaiusJard 这就像一个魅力,非常感谢你帮助我走上正确的道路。

标签: sql sql-server tsql


【解决方案1】:

如果我猜对了

declare @t table (
rubrieknummer int,
cnt int);

INSERT @t(rubrieknummer, cnt)
SELECT R.rubrieknummer, COUNT(Vr.voorwerpnummer) 
FROM Rubriek R 
INNER JOIN voorwerp_in_rubriek Vr ON R.rubrieknummer = Vr.rubrieknummer 
GROUP BY Vr.rubrieknummer, R.rubrieknummer;

--select * from @t;

with t as(
  select rubrieknummer, cnt
  from @t
  union all
  select r.hoofdrubriek, cnt
  from t
  join Rubriek r on t.rubrieknummer = r.rubrieknummer
)
select rubrieknummer, sum(cnt) cnt  
from t
group by rubrieknummer;

应用到你的小提琴数据返回

rubrieknummer   cnt
<null>  42
100 42
101 26
102 6
103 10
10000   8
10100   4
10101   1
10102   3
10500   4
10501   2
10502   2
15000   18
15100   6
15101   2
15102   2
15103   2
15500   12
15501   4
15502   3
15503   5
20000   6
20001   2
20002   1
20003   1
20004   2
25000   4
25001   1
25002   1
25003   1
25004   1
30001   2
30002   1
30004   3

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多