在一次項目中遇到一種需求,須要記錄某產品的替換記錄。算法
實際應用舉例爲:產品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的遞歸查詢。
遺留問題:暫時我沒有想出能夠同時向上和向下遞歸的算法。