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的遞歸查詢。

遺留問題:暫時我沒有想出能夠同時向上和向下遞歸的算法。

相關文章
相關標籤/搜索