【问题标题】:Recursive CTE possible for this?递归CTE可能吗?
【发布时间】:2014-08-17 01:32:48
【问题描述】:

我的产品数据结构如下:

ProductID   OptionID    Lvl OptionDescription   SubOptionID SubOptionDescription
HPH 6   1   Model   10  Studio
HPH 6   1   Model   11  DJ
HPH 7   2   Device  12  Bluetooth
HPH 7   2   Device  13  Cable
HPH 7   2   Device  14  Remote

产品可以有任意数量的级别。我需要遍历层次结构并生成以下输出 - 每个产品选项的描述:

Studio-Bluetooth
Studio-Cable
Studio-Remote
DJ-Bluetooth
DJ-Cable
DJ-Remote

我查看了 CTE,但这些示例往往包含相邻的列表(employeeID;managerID..etc),这在此处似乎不合适。

我怎样才能实现这个输出?

谢谢。

CREATE TABLE [dbo].[Products](
    [ProductID] [varchar](50) NULL,
    [OptionID] [int] NULL,
    [Lvl] [int] NULL,
    [OptionDescription] [varchar](50) NULL,
    [SubOptionID] [int] NULL,
    [SubOptionDescription] [varchar](50) NULL
) ON [PRIMARY]

insert into Products (ProductID, OptionID, Lvl, OptionDescription, SubOptionID,    SubOptionDescription) values ('HPH', 6, 1, 'Model', 10, 'Studio')
insert into Products (ProductID, OptionID, Lvl, OptionDescription, SubOptionID, SubOptionDescription) values ('HPH', 6, 1, 'Model', 11, 'DJ')
insert into Products (ProductID, OptionID, Lvl, OptionDescription, SubOptionID, SubOptionDescription) values ('HPH', 7, 2, 'Device', 12, 'Bluetooth')
insert into Products (ProductID, OptionID, Lvl, OptionDescription, SubOptionID, SubOptionDescription) values ('HPH', 7, 2, 'Device', 13, 'Cable')
insert into Products (ProductID, OptionID, Lvl, OptionDescription, SubOptionID, SubOptionDescription) values ('HPH', 7, 2, 'Device', 14, 'Remote')

【问题讨论】:

    标签: sql-server tsql recursion common-table-expression


    【解决方案1】:
    with cte as (
        -- Root level
        select p.Lvl, cast(p.SubOptionDescription as varchar(max)) as [ProductOption]
        from @Products p where p.Lvl = 1
        union all
        -- Anchor part - cartesian here?
        select p.Lvl, c.ProductOption + '-' + p.SubOptionDescription
        from @Products p
            inner join cte c on c.Lvl = p.Lvl - 1
    )
    select c.ProductOption from cte c;
    

    一些笔记。

    现在您的示例答案暗示您需要创建一个笛卡尔积。我希望不是这样,因为行数会爆炸式增加。如果还有其他从您的样本中看不到的连接条件,您可以在 CTE 的锚点部分中引入它们。

    您可能还希望只返回叶行。有几种方法可以做到这一点 - 您的实际数据中可能有一些属性,或者rank()top (1) with ties 的组合可以解决问题,尽管它不会特别有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多