【发布时间】:2013-09-06 13:07:46
【问题描述】:
我在这里看到过类似的问题,但要么我没有得到答案,要么它们不适用......这就是我需要的,并且认为这真的很简单: 我有一组项目,每个项目都有一组子项目。每个项目的子项目数会发生变化。例如:
Item 1
SubItem 1-1
SubItem 1-2
SubItem 1-3
Item 2
SubItem 2-1
Item 3
SubItem 3-1
SubItem 3-2
对于一个非常具体的用途,希望是为每个项目上的每个可能的子项目组合添加注释,并在每个子项目上加上一个布尔属性,所以它最终是这样的:
Item 1 Subitem 1-1 = True, Subitem 1-2 = True, Subitem 1-3 = True
Item 1 Subitem 1-1 = True, Subitem 1-2 = True, Subitem 1-3 = False
Item 1 Subitem 1-1 = True, Subitem 1-2 = False, Subitem 1-3 = True
Item 1 Subitem 1-1 = True, Subitem 1-2 = False, Subitem 1-3 = False
Item 1 Subitem 1-1 = False, Subitem 1-2 = True, Subitem 1-3 = True
... (the rest of Item 1 possible combinations)
Item 2 Subitem 2-1 = True
Item 2 Subitem 2-1 = False
Item 3 Subitem 3-1 = True, Subitem 3-2 = True
Item 3 Subitem 3-1 = True, Subitem 3-2 = False
Item 3 Subitem 3-1 = False, Subitem 3-2 = True
Item 3 Subitem 3-1 = False, Subitem 3-2 = False
我尝试了多种内部连接和交叉连接,但无法成功。我认为布尔部分可以使用交叉连接添加到具有两行值 True 和 False 的表中,并且我还认为我需要执行“FOR XML”子查询以在一行中获取子项,但是我无法获得子项组合
这是我目前所拥有的:
-- Schema creation and data filling
DECLARE @Item TABLE (ItemId int, Name varchar(50))
DECLARE @Item_SubItem TABLE (ItemId int, SubitemId int)
DECLARE @SubItem TABLE (SubitemId int, Name varchar(50))
INSERT INTO @Item values (1, 'Item 1')
INSERT INTO @Item values (2, 'Item 2')
INSERT INTO @Item values (3, 'Item 3')
INSERT INTO @SubItem values (1, 'SubItem 1-1')
INSERT INTO @SubItem values (2, 'SubItem 1-2')
INSERT INTO @SubItem values (3, 'SubItem 1-3')
INSERT INTO @SubItem values (4, 'SubItem 2-1')
INSERT INTO @SubItem values (5, 'SubItem 3-1')
INSERT INTO @SubItem values (6, 'SubItem 3-2')
INSERT INTO @Item_SubItem values (1, 1)
INSERT INTO @Item_SubItem values (1, 2)
INSERT INTO @Item_SubItem values (1, 3)
INSERT INTO @Item_SubItem values (2, 4)
INSERT INTO @Item_SubItem values (3, 5)
INSERT INTO @Item_SubItem values (3, 6)
select I.Name, SI.Name
from @Item I
inner join @Item_SubItem ISI on ISI.ItemId = I.ItemId
INNER JOIN @SubItem SI on SI.SubitemId = ISI.SubitemId
order by I.Name, SI.Name
-- Actual query
SELECT ItemName = M.name, (SELECT iC.name + '=' + CASE AuxCode WHEN 1 THEN 'True' WHEN 0 THEN 'False' END + ' '
FROM Item_subitem AS iCGM
INNER JOIN Subitem AS iC ON iC.SubitemId = iCGM.SubitemId
CROSS JOIN (SELECT AuxCode = 1 UNION SELECT AuxCode = 0) Aux
WHERE iCGM.ItemId = M.ItemId
ORDER BY iC.name
FOR XML PATH(''))
FROM Item M
所以,对我来说失败的是子查询。任何帮助将不胜感激!
【问题讨论】:
-
@epoch 谢谢,但我不认为这是我的情况......我需要每个项目的所有子项目组合,而提问者需要全部反对所有......
-
一个项目的最大子项目数是多少?您的结果可能会爆炸,因为 n 项的组合数为 2^n。例如,10 个子项将产生 1024 种组合...
-
@Dan 嗯,到今天为止,有一个 Item 有 7 个子项,但通常每个项有 2~3 个子项
-
+1 用于有趣且具有挑战性的查询,但我怀疑如果您使用 C# 等客户端语言生成这些排列,您将获得比您在 SQL Server 中可能获得的更好的性能。
标签: sql sql-server join