【问题标题】:CTE Recursive Query to fill in a SequenceCTE 递归查询填充序列
【发布时间】:2014-12-30 13:15:53
【问题描述】:

在此 TSQL CTE 中,我正在尝试构建一个发票列表,该列表以递归方式从父版本开始,每张发票一直到第 1 版。

With
  myList
  AS (Select 10000 as INVOICE, 3 as VER
      UNION ALL
      Select 20000 as INVOICE, 5 as VER
      UNION ALL
      Select 30000 as INVOICE, 8 as VER
      UNION ALL
      Select 40000 as INVOICE, 2 as VER)
 ,newList (Invoice, Ver)
  AS (Select
       L1.Invoice
      ,L1.Ver
      from
       myList L1
      UNION ALL
      Select
       L2.Invoice
      ,L2.Ver - 1 Ver
      from
       myList L2
      Join
       newList L3
       on L2.invoice = L3.Invoice and L2.VER = L3.VER
      Where
       L2.Ver > = 1 )
 Select * from newList order by INVOICE, VER desc

“myList”上的选择将为您提供:

Invoice Ver
10000   3
20000   5
30000   8
40000   2

而我希望达到的是:

Invoice Ver
10000   3
10000   2
10000   1
20000   5
20000   4
20000   3
20000   2
20000   1
30000   8
30000   7
30000   6
30000   5
30000   4
30000   3
30000   2
30000   1
40000   2
40000   1

我尝试了很多变化(当然不是正确的!)但我能做的最好的就是只达到第二级......

Invoice Ver
10000   3
10000   2
20000   5
20000   4
30000   8
30000   7
40000   2
40000   1

感谢观看!

【问题讨论】:

    标签: sql tsql recursion common-table-expression


    【解决方案1】:

    你需要有一个递归 CTE,在每个递归调用中需要减少 ver

    With myList
    AS 
    (     Select 10000 as INVOICE, 3 as VER
          UNION ALL
          Select 20000 as INVOICE, 5 as VER
          UNION ALL
          Select 30000 as INVOICE, 8 as VER
          UNION ALL
          Select 40000 as INVOICE, 2 as VER
     )
     ,newList (Invoice, Ver)
      AS 
     (
        SELECT INVOICE, VER from myList
        UNION ALL
        SELECT INVOICE, VER-1 FROM newList
        WHERE VER >1
      )
      SELECT * FROM newList order by INVOICE, VER desc
    

    【讨论】:

    • 哈哈 - 以为我正在做你说我需要做的事情。我想微软示例让我失望,因为它的 CTE 的两条腿都引用了锚查询。无论如何,干得好!
    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2016-09-28
    • 2018-08-21
    • 2012-11-09
    • 2014-03-29
    相关资源
    最近更新 更多