2013-02-15 2 views
1

SQL Server에서 CTE를 사용하여 재귀 쿼리를 작성하는 데 도움이 필요합니다.상위 부모를 얻는 SQL Server 재귀 쿼리

나는 입력 매개 변수로 주문 번호가 있습니다. 그 상위 부모 발송 세부 정보를 표시해야합니다. 아이를 찾더라도 .. 즉 3 번 주문을 검색하면 최상위 부모 주문을 받아야합니다. 즉

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

+0

@sgeddes 'TblSerialReleation' 테이블에있는 것으로 보입니다 – GolfWolf

+0

@ w0lf - 거기에있는 것으로 보입니다. 그러나 TS2가 BS2ab (20)과 다시 일치하는 방식을 알아낼 수는 없습니다. 나는 그것을 볼 수 없다 :) – sgeddes

답변

2

는 관계가 다른 방법으로 주위 (BS2ab (주문 20) BS2 통해 TS1 (주문 3)의 자식이 갈 것 같다.

을이 아이에서 시작하는 경우라면 (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