在一次项目中遇到一种需求,须要记录某产品的替换记录。算法
实际应用举例为:产品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
查询结果以下:
从结果中咱们能够看到,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
结果以下:
能够看出,产品201曾经替换了产品101,然后201产品又被303替换了。
到此,咱们成功实现了SQL的递归查询。
遗留问题:暂时我没有想出能够同时向上和向下递归的算法。