【问题标题】:SQL Server Recursive Query to get Top parentSQL Server 递归查询以获取顶级父级
【发布时间】:2013-01-31 13:48:43
【问题描述】:

在使用 SQL Server 中的 CTE 进行递归查询时,我需要您的帮助。

我有订单号作为输入参数。我需要显示其顶级父发货详细信息。即使我搜索它的孩子.. 即如果我搜索订单号 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

提前致谢。

【问题讨论】:

  • 我觉得我们在这里遗漏了一些东西——它们如何链接(如果你现在要手动做的话)?我在上面的数据中没有看到这种关系。
  • @sgeddes 它似乎在TblSerialReleation 表中
  • @w0lf -- 我看到它应该在那里 -- 但我无法弄清楚 TS2 如何在调度表中匹配回 BS2ab (20) -- 我没有看到它:)
  • @sgeddes 正确,那里有一些缺失的链接 :)
  • serialNo 条目可以有多个父项吗?

标签: sql sql-server common-table-expression recursive-query


【解决方案1】:

查看您的数据,关系似乎相反(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

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2021-11-02
    • 2021-12-26
    相关资源
    最近更新 更多