2013-02-15 108 views
1

我需要你在SQL Server中使用CTE進行遞歸查詢的幫助。SQL Server遞歸查詢獲得頂級父

我有order no作爲輸入參數..我需要顯示其頂級父寄件的詳細信息。即使我搜索它的孩子..即如果我搜索訂單3號,我應該得到其頂級父母訂單號。這是20

這裏是我的表結構..提前

CREATE TABLE #TblSerialNo 
    (
     [SRno] [char](20) NOT NULL , 
     [CustSrNo] [varchar](75) NULL 
    ) 
CREATE TABLE #TblSerialReleation 
    (
     [SRno] [char](20) NOT NULL , 
     [ChildSRno] [char](20) NOT NULL 
    ) 
CREATE TABLE #TblDespatch 
    (
     [SRno] [char](20) NOT NULL , 
     OrderNo INT NOT NULL 
    ) 

INSERT INTO #TblSerialNo VALUES ('TS1', 'DD123CV1') 
INSERT INTO #TblSerialNo VALUES ('TS2', 'DD123CV2') 
INSERT INTO #TblSerialNo VALUES ('TS3', 'DD123CV3') 

INSERT INTO #TblSerialNo VALUES ('BS1', 'DD12sfs3CV1') 
INSERT INTO #TblSerialNo VALUES ('BS2', 'DD1et23CV2') 
INSERT INTO #TblSerialNo VALUES ('CS1', 'DD12e3CV1') 
INSERT INTO #TblSerialNo VALUES ('CS2', 'DD12fe3CV2') 

INSERT INTO #TblSerialNo VALUES ('BS1aa', 'DD12d3CV1') 
INSERT INTO #TblSerialNo VALUES ('BS1ab', 'DDd123CV2') 
INSERT INTO #TblSerialNo VALUES ('BS1ac', 'DD1r23CV3') 
INSERT INTO #TblSerialNo VALUES ('BS2aa', 'DDs123CV4') 
INSERT INTO #TblSerialNo VALUES ('BS2ab', 'DD12d3CV1') 
INSERT INTO #TblSerialNo VALUES ('BS2ac', 'DD1s23CV2') 
INSERT INTO #TblSerialNo VALUES ('CS1aa', 'DD1s23CV3') 
INSERT INTO #TblSerialNo VALUES ('CS1ab', 'DD12s3CV4') 
INSERT INTO #TblSerialNo VALUES ('CS1ac', 'DD123dCV1') 
INSERT INTO #TblSerialNo VALUES ('CS2aa', 'DDa123CV2') 
INSERT INTO #TblSerialNo VALUES ('CS2ab', 'DDa123CV3') 
INSERT INTO #TblSerialNo VALUES ('CS2ac', 'DDa123CV4') 

--================ Relation table ============== 

INSERT INTO #TblSerialReleation VALUES ('TS1', 'BS1') 
INSERT INTO #TblSerialReleation VALUES ('TS1', 'BS2') 
INSERT INTO #TblSerialReleation VALUES ('TS2', 'CS1') 
INSERT INTO #TblSerialReleation VALUES ('TS2', 'CS2') 
INSERT INTO #TblSerialReleation VALUES ('BS1', 'BS1aa') 
INSERT INTO #TblSerialReleation VALUES ('BS1', 'BS1ab') 
INSERT INTO #TblSerialReleation VALUES ('BS1', 'BS1ac') 
INSERT INTO #TblSerialReleation VALUES ('BS2', 'BS2aa') 
INSERT INTO #TblSerialReleation VALUES ('BS2', 'BS2ab') 
INSERT INTO #TblSerialReleation VALUES ('BS2', 'BS2ac') 
INSERT INTO #TblSerialReleation VALUES ('CS1', 'CS1aa') 
INSERT INTO #TblSerialReleation VALUES ('CS1', 'CS1ab') 
INSERT INTO #TblSerialReleation VALUES ('CS1', 'CS1ac') 
INSERT INTO #TblSerialReleation VALUES ('CS2', 'CS2aa') 
INSERT INTO #TblSerialReleation VALUES ('CS2', 'CS2ab') 
INSERT INTO #TblSerialReleation VALUES ('CS2', 'CS2ac') 
--=========== Despatch 
INSERT INTO #TblDespatch VALUES ('CS2ac', 1) 
INSERT INTO #TblDespatch VALUES ('CS2ab', 1) 
INSERT INTO #TblDespatch VALUES ('CS2ac', 1) 
INSERT INTO #TblDespatch VALUES ('CS1aa', 1) 
INSERT INTO #TblDespatch VALUES ('CS1ac', 1) 
INSERT INTO #TblDespatch VALUES ('CS2ac', 1) 
INSERT INTO #TblDespatch VALUES ('CS2ac', 1) 
INSERT INTO #TblDespatch VALUES ('TS1', 1) 
INSERT INTO #TblDespatch VALUES ('TS3', 2) 
INSERT INTO #TblDespatch VALUES ('TS2', 3) 
INSERT INTO #TblDespatch VALUES ('BS2ab', 20) 

DROP TABLE #TblDespatch 
DROP TABLE #TblSerialNo 
DROP TABLE #TblSerialReleation 

感謝。

+1

我覺得我們失去了一些東西 - 他們怎麼鏈接(如果你現在用手工做)?我沒有看到上述數據中的關係。 – sgeddes 2013-02-15 14:59:10

+0

@sgeddes它似乎在'TblSerialReleation'表 – GolfWolf 2013-02-15 14:59:36

+0

@ w0lf - 我看到它假設存在 - 但我無法弄清楚TS2如何在發送表中匹配BS2ab(20) - 我沒有看到:) – sgeddes 2013-02-15 15:01:55

回答

2

看你的數據,關係似乎跟周圍的其他方式(BS2ab(第20條)是TS1(3階)通過BS2孩子。

如果是這樣的話,從孩子開始(BS2ab),你可以找到它的頂部父用下面的語句:

;with ParentOrders as(
    select 
    convert(char(20), 'BS2ab')as SRno, 
    0 as Level 

    union all 

    select r.SRno, o.Level + 1 
    from ParentOrders o 
    join TblSerialReleation r 
    on o.SRNo = r.ChildSRno 
) 
select top 1 SRNO 
    from ParentOrders 
    order by Level desc 

這裏的查詢工作示例:http://www.sqlfiddle.com/#!3/e253e/6