1

我有一个要求,其中用户是用户将单个项目输入到表中,该表带有一个触发器,该触发器在表中创建有效的组合记录(即 Powerset 或子集)。我面临的挑战是记录可以具有父/子关系,并且在这种情况下,在 2^n 组值中存在无效的子集。

这是一个简化的例子。

数据:

 ID     Item     Parent_ID  
  1      A        Null  
  2      B        Null
  3      C        Null
  4      D        1  

期望的输出:

A
B
C
D
A,B
A,C
B,C
A,D
A,B,C
A,B,D
A,C,D
A,B,C,D

在我意识到数据将具有父/子关系之前,我将使用以下代码:

WITH ctePowerset(Combo) AS (SELECT     RTRIM(CONVERT(VarChar(30), Item_ID)) AS Item_ID
                                                                        FROM         dbo.tblPowerset
                                                                        UNION ALL
                                                                        SELECT     CONVERT(Varchar(30), RTRIM(CONVERT(varchar(30), TL.Item_ID)) + ',' + cte.Combo) AS combo
                                                                        FROM         dbo.tblPowerset AS TL INNER JOIN
                                                                                              ctePowerset AS cte ON CONVERT(varchar(30), TL.Item_ID) <> cte.Combo AND TL.Item_ID < LEFT(cte.Combo, CHARINDEX(',', 
                                                                                              cte.Combo + ',') - 1))
SELECT     Combo
 FROM         ctePowerset AS ctePowerset_1  

但是通过这个公用表表达式,我得到了所有 15 种可能的组合,而不仅仅是 12 种有效/所需的组合。

我是一名新手 SQL 程序员,我一直试图找出一个多星期的解决方案,但绝对没有成功。任何帮助将不胜感激(即使它告诉我这是一项不可能完成的任务)。希望我提供了足够的信息,有人可以帮助我。

4

0 回答 0