SQL2005递归问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL2005递归问题相关的知识,希望对你有一定的参考价值。

数据库结构如图。
编写存储过程,在传入参数为12时。
删除D_PopedomId为312的同时,D_TopID为12的也一起删除
另外如图,在删除TopId为12的同时,D_NewClassId为13、18的也一起删除以此类推
。请给出递归的完整代码。
谢谢,答案满意另加50分。
(附):这只是简单数据结构
在删除的同时,向下级的递归删除。一楼的明显不行,而且,我要的是存储过程

参考技术A 不太会写存储过程 但一楼是能解决删除D_PopedomId为33的同时,D_TopID为33的 参考技术B delete from dbe.D_Popedom where D_popedomID = 33 or D_TopID = 33. 参考技术C create proc sp_del
@ai_para int
as
delete
from d_popedom
where d_popedomid = @ai_para
or d_topid = @ai_para
参考技术D Ok本回答被提问者采纳

递归 SQL 查询 2008

【中文标题】递归 SQL 查询 2008【英文标题】:Recursive Sql Query 2008 【发布时间】:2015-07-13 11:30:12 【问题描述】:

我需要计算indebtedness 列的值,以便当openingBalance !=0 then indebtedness = openingBalnce+SalesTotal-SalesReturn 时。但是,当之前的monthSalesopeningBalnce = 0 then indebtedness = indebtedness 与相同的SalesID。如果previous value = 0 得到previous value 并继续得到previous value 直到在此列中有值:

SalesMonth SalesID  openingBalance  SalesTotal SalesReturn  Indebtednes
1          1        352200          0          5600         NULL
1          2        50000           1100       0            NULL
1          3        9500            6000       0            NULL
2          1        0               0          1200         NULL
2          2        0               300        0            NULL
2          3        0               500        1000         NULL
3          1        0               600        0            NULL
3          2        0               200        0            NULL
3          3        0               0          10           NULL
.
.
.
12         1        0               0          0            NULL
12         2        0               0          0            NULL
12         3        0               0          0            NULL

输出如下:

 when openingBalance !=0 then Indebtednes=openingBalnce+SalesTotal-SalesReturn

    when openingBalnce =0 then Indebtednes=Indebtednes (of the previous
    month of the same SalesID)+SalesTotal-SalesReturn.

And this is the output i want.

 SalesMonth SalesID  openingBalance  SalesTotal SalesReturn  Indebtednes
    ---------- -------  --------------  ---------- -----------  ------------  
    1           1             352200     0          5600            346600
    ------------------------------------------------------------------------
    1           2             50000     1100         0              51100
    ------------------------------------------------------------------------
    1           3             9500      6000         0              15500
    ------------------------------------------------------------------------
    2           1              0         0          1200            345400
    ------------------------------------------------------------------------
    2           2              0         300          0             51400
    ------------------------------------------------------------------------
    2           3              0         500        1000            15000
    ------------------------------------------------------------------------
    3           1              0         600         0              346000
    ------------------------------------------------------------------------
    3           2              0         200         0              51600
    -----------------------------------------------------------------------
    3           3              0         0           10             14990
    -----------------------------------------------------------------------
    .
    .
    .
    12           1             0          0           0              NULL
    ----------------------------------------------------------------------
    12           2             0          0           0              NULL
    ----------------------------------------------------------------------
    12           3             0          0           0              NULL

【问题讨论】:

你也可以添加预期的输出 对于 salesMonth=1 和 SalesID=1 Indebtednes =346600 我的意思是预期的样本输出,其数据基于问题中的上述样本输入。您可以编辑问题并添加详细信息 for salesMonth=1 and SalesID=1 Indebtednes =346600 salesMonth=2 and salesID =1 indebtedness = 346600 and the same case with SalesID =2,3 when openingBalnce !=0 then indebtedness=openingBalnce+SalesTotal -SalesReturn 但是,当openingBalance = 0 获取相同SalesID 的上个月的Indebtednes 时,问题是如果上一个indebtedness 为0 获取上个月的值并继续获取上个月的上一个值直到得到值,怎么办这??? 【参考方案1】:

您可以执行CROSS APPLY 或共同相关的子查询。像这样的东西。 SQL Fiddle

样本数据

DECLARE @Sales TABLE (SalesMonth INT,SalesID  INT,openingBalance  MONEY,SalesTotal MONEY,SalesReturn  MONEY,Indebtednes MONEY)
insert into @Sales 
VALUES(1,           1,             352200,     0,          5600,            Null),
(1,           2,             50000,     1100,         0,              Null),
(1,           3,             9500,      6000,         0,              Null),
(2,           1,              0,         0,          1200,            Null),
(2,           2,              0,         300,          0,             Null),
(2,           3,              0,         500,        1000,            Null),
(3,           1,              0,         600,         0,              NULL),
(3,           2,              0,         200,         0,              NULL),
(3,           3,              0,         0,           10,             NULL)

选择查询

SELECT C1.SalesMonth,C1.SalesID,C1.openingBalance,C1.SalesTotal,C1.SalesReturn,C2.Indebt
FROM @Sales C1
CROSS APPLY (
SELECT TOP 1 CASE WHEN openingBalance = 0 THEN NULL ELSE openingBalance + SalesTotal - SalesReturn END Indebt
FROM @Sales C2 WHERE C2.SalesID = C1.SalesID AND openingBalance <> 0  AND C2.SalesMonth <=C1.SalesMonth ORDER BY SalesMonth Desc
) C2

更新查询

UPDATE C1 
SET Indebtednes = 
(
SELECT TOP 1 CASE WHEN openingBalance = 0 THEN NULL ELSE openingBalance + SalesTotal - SalesReturn END Indebt
FROM @Sales C2 WHERE C2.SalesID = C1.SalesID AND openingBalance <> 0  AND C2.SalesMonth <=C1.SalesMonth ORDER BY SalesMonth Desc
)
FROM @Sales C1

SELECT * FROM @Sales

【讨论】:

请再次查看我的帖子并给我答案,我用我想要的输出编辑了帖子,谢谢你的帮助:)

以上是关于SQL2005递归问题的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2005 with如何实现递归

Sql ServerSQL SERVER 递归查询

谁可以给个sqlserver2005两张表之间的递归查询,我看网上都是一张表两个字段之间递归查询.

SQL server2005上千万条数据分页查询怎么做优化?

sql 2005 简体中文标准版

在sql server中利用with as实现递归功能