提问人:user3818712 提问时间:10/17/2022 最后编辑:user3818712 更新时间:10/18/2022 访问量:84
SQL 2008 中的循环
loop in SQL 2008
问:
我有一个表,当我输入父 ID 时,我需要提取所有子客户端 ID。代码将继续运行,直到 clientid = parentid。 在下表中,如果我输入 parentid 01,结果将是 clientid 01、02 和 04。
如果循环不是最好的方法,那么最好的选择是什么?
客户端 ID | 家长 ID | 客户 |
---|---|---|
01 | 01 | 客户01 |
02 | 01 | 客户02 |
03 | 100 | 客户03 |
04 | 02 | 客户04 |
DECLARE @Client varchar(20)
set @Client='1000'
WITH _RecursiveCTE AS
(
-- Base case
SELECT iClientID, iParentClientID, sClientCode
FROM tblClient
WHERE iClientID <> iParentClientID -- Prevents infinite recursion with
your specific data model
UNION ALL
-- Recursive case
SELECT C.iClientID, C.iParentClientID, C.sClientCode
FROM _RecursiveCTE AS RC -- Notice the self-referenced CTE here creates
the recursion
INNER JOIN tblClient AS C ON RC.iClientID = C.iParentClientID
)
SELECT iClientID, iParentClientID, sClientCode
FROM _RecursiveCTE
WHERE sClientCode = @Client
UNION ALL
-- Makes sure we don't miss out on the case we pre-filtered from the
recursive CTE
SELECT iClientID, iParentClientID, sClientCode
FROM tblClient
WHERE iClientID = iParentClientID
AND sClientCode = @Client
答:
0赞
J.D.
10/17/2022
#1
正如评论中提到的,递归 CTE 通常是解决树型/层次结构问题时要走的路。在关系数据库中,循环通常不是一个很好的工具,因为关系数据库旨在使用基于集合的解决方案来解决问题。
递归 CTE 示例:
WITH _RecursiveCTE AS
(
-- Base case
SELECT ClientID, ParentID, ParentID AS OriginalParentID
FROM dbo.YourTable
UNION ALL
-- Recursive case
SELECT YC.ClientID, YC.ParentID, RC.OriginalParentID
FROM _RecursiveCTE AS RC -- Notice the self-referenced CTE here creates the recursion
INNER JOIN dbo.YourTable AS YC
ON RC.ClientID = YC.ParentID
WHERE RC.ClientID <> RC.ParentID -- Prevents infinite recursion with your data model
)
SELECT ClientID
FROM _RecursiveCTE
WHERE OriginalParentID = '01';
评论
0赞
user3818712
10/17/2022
谢谢你,我被困在无限递归中。我添加了 where 语句,但我得到了 1 个结果。当我看到您的第二篇帖子以添加 where 语句时,我正在尝试不同的选项,但我仍然得到 1 个结果。我可以手动看到应该有更多的结果
0赞
J.D.
10/17/2022
@user3818712是的,我很害怕。尝试思考如何优雅地处理您的数据。成为自己的父母似乎很奇怪。如果我提出更新,我会告诉你。ClientId
0赞
user3818712
10/17/2022
好的,我已经做了一些更改,但仍然没有得到我想要的结果。我已经添加了我在问题中使用的代码。
0赞
J.D.
10/18/2022
@user3818712 终于有机会自己测试一下,很快就弄清楚了问题所在。对不起。您需要通过每个递归级别传递顶层,以便您可以在最后正确过滤它。请参阅我更新的答案。ParentID
0赞
J.D.
10/18/2022
@user3818712 太好了!对不起,来回走动,我只需要坐在电脑屏幕前就可以正确了,哈哈。干杯!
评论