Я видел похожие вопросы, размещенные здесь, но либо я не получаю ответы, либо они не применяются ... вот что мне нужно и подумал, что это будет очень просто: У меня есть набор элементов, и каждый элемент имеет набор подэлементов. Количество подэлементов изменяется на каждый элемент. EG:Создание всех возможных комбинаций с SQL Server
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
Я пробовал varietè внутренних соединений и кросс-соединений, но не смог заставить его работать. Я думаю, что логическая часть может быть добавлена с использованием перекрестного соединения к таблице с двумя строками, которые имеют значения 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
таким образом, это подзапрос, что провал для меня. Любая помощь приветствуется!
смотрите здесь: http://stackoverflow.com/questions/3621494/the-most-elegant-way-to-generate-permutations-in-sql-server – epoch
@epoch Спасибо, но я не думаю это мой же случай ... Мне нужны все комбинации подэлементов на элемент, а апеллятору нужны все против всех ... –
Каково максимальное количество подэлементов для элемента? Ваш результат может потенциально взорваться, так как количество комбинаций для n элементов будет 2^n. Например, 10 подэлементов приведут к 1024 комбинациям ... – Dan