Sql 如何找到未知数量的产品选项的所有组合?

Sql 如何找到未知数量的产品选项的所有组合?,sql,sql-server,combinations,product,options,Sql,Sql Server,Combinations,Product,Options,我有一个包含3列的表,Model\u Name、Style\u Name和Option\u Name。如何连接按型号名称和样式名称分组的选项名称的所有可用组合?我想做的是在单独的行中列出一个包含所有可能选项组合的产品 我一直试图在组中使用STRING\u AGG(Option\u Name,“/”),但这只是合并了所有Option\u名称 这张桌子看起来像这样 Model_Name | Style_Name | Option_Name 7000 Series | Front Door | W

我有一个包含3列的表,Model\u Name、Style\u Name和Option\u Name。如何连接按型号名称和样式名称分组的选项名称的所有可用组合?我想做的是在单独的行中列出一个包含所有可能选项组合的产品

我一直试图在组中使用
STRING\u AGG(Option\u Name,“/”)
,但这只是合并了所有Option\u名称

这张桌子看起来像这样

Model_Name  | Style_Name | Option_Name 
7000 Series | Front Door | White
7000 Series | Front Door | Extra Lock 
7000 Series | Front Door | Foam Filler
理想情况下,我们将使用SQL Server返回所有组合

7000 Series | Front Door | White
7000 Series | Front Door | White / Extra Lock
7000 Series | Front Door | White / Foam Filler
7000 Series | Front Door | White / Extra Lock / Foam Filler
7000 Series | Front Door | Extra Lock
7000 Series | Front Door | Extra Lock / Foam Filler
7000 Series | Front Door | Foam Filler
等等

这才刚刚回来

7000 Series | Front Door | White / Extra Lock / Foam Filler

您需要一个递归CTE:

with cte as (
      select model_name, style_name, option_name, convert(varchar(max), option_name) as option_names
      from Product_Option_Master pom
      union all
      select cte.model_name, cte.style_name, pom.option_name,
             convert(varchar(max), concat(cte.option_names, ' / ', pom.option_name))
      from cte join
           Product_Option_Master pom
           on pom.model_name = cte.model_name and
              pom.style_name = cte.style_name and
              pom.option_name > cte.option_name
     )
select *
from cte;

是个傻瓜。

Gordon,我把最后的选项一遍又一遍地重复着。例如,我得到最后一个选项是Screen:Half Screen/Other选项的记录,然后我看到记录上写着Screen:Half Screen/Screen:Half Screen/Screen:Half Screen/Screen:Half Screen/Option1/Option2等等。我想知道我是否需要调整连接,以便一次又一次地消除这些重复的选项。好的,所以它似乎一次又一次地重复最后一个选项名。我找到解决办法后会告诉你的。@Soiss。你看到db小提琴了吗?它不会重复最后一个选项,我知道了!我的终结者有个问题导致了一个巨大的循环。谢谢你的耐心和示范!!!
with cte as (
      select model_name, style_name, option_name, convert(varchar(max), option_name) as option_names
      from Product_Option_Master pom
      union all
      select cte.model_name, cte.style_name, pom.option_name,
             convert(varchar(max), concat(cte.option_names, ' / ', pom.option_name))
      from cte join
           Product_Option_Master pom
           on pom.model_name = cte.model_name and
              pom.style_name = cte.style_name and
              pom.option_name > cte.option_name
     )
select *
from cte;