SQL Server实现数据的递归查询

在一次项目中遇到一种需求,须要记录某产品的替换记录。算法

实际应用举例为:产品101被201替换,以后201又被303替换,303又被109替换;产品102被202替换,以后202又被105替换。app

如今咱们须要在已知任何产品序列号时,能够检索出该产品的整个被替换过程和最终的替换结果。spa

设计表格以下:设计

产品替换记录(原序列号,替换后序列号)code

示例数据以下:blog

原序列号 替换后序列号
101 201
102 202
201 303
303 109
202 105

 

好比,已经表中存在过201这一产品,那么我想知道201这个产品以后的整个替换过程,那么咱们应该能够检索出从201到109的整个过程。递归

下面咱们就来实现这种递归查询:ip

先建立表并插入示例数据:ci

CREATE TABLE ProductHistory 
 (
    OrgProduct int,
    CurProduct int
);
 
 INSERT INTO ProductHistory values
    (101,201),
    (102,202),
    (201,303),
    (303,109),
    (202,105) 

 

下面开始咱们的递归查询:get

WITH PHistory(Org,Cur) AS
(
    SELECT OrgProduct,CurProduct FROM ProductHistory WHERE OrgProduct=201
    UNION ALL
    SELECT A.OrgProduct,A.CurProduct FROM ProductHistory A, PHistory B
    WHERE A.OrgProduct=B.Cur 
)
select * from PHistory

查询结果以下:

image

从结果中咱们能够看到,201产品被303产品替换了,303产品又被109产品替换了。

若是咱们想追溯201产品以前的记录,那么咱们只要把查询条件交换一下便可:

WITH PHistory(Org,Cur) AS
(
    SELECT OrgProduct,CurProduct FROM ProductHistory WHERE OrgProduct=201
    UNION ALL
    SELECT A.OrgProduct,A.CurProduct FROM ProductHistory A, PHistory B
    WHERE A.CurProduct=B.Org    --将查询条件交换一下就能够追溯历记录 
)
select * from PHistory

结果以下:

image

能够看出,产品201曾经替换了产品101,然后201产品又被303替换了。

到此,咱们成功实现了SQL的递归查询。

遗留问题:暂时我没有想出能够同时向上和向下递归的算法。

相关文章
相关标签/搜索