Просто используйте CROSS JOIN .
create table Variations
(
Id int not null,
Value varchar(50) not null
)
create table Variation_Attributes
(
Id int not null,
VariationId int not null,
Value varchar(50) not null
)
GO
insert into Variations
(Id, Value)
values
(1 , 'Color'),
(2 , 'Size'),
(3 , 'Length');
insert into Variation_Attributes
(Id , VariationId , Value)
values
(1 , 1 , 'Black'),
(2 , 1 , 'Red'),
(3 , 2 , 'Large'),
(4 , 2 , 'Small'),
(5 , 2 , 'Medium'),
(6 , 3 , 'Tall');
GO
select *
from Variations
cross join Variation_Attributes
ОБНОВЛЕНИЕ
После выпуска ОП мы можем лучше оценитьвопрос и сама проблема. Это плохая дизайнерская проблема, ведущая к сложному решению. Лучшим решением может быть перепроектирование таблиц. Таблица для каждого типа имущества может работать лучше здесь Color, Size Length
.
С другой стороны, если вы должны дать атрибуты объекту, скажем, это магазин, который продает электрические устройства для кухни, так что выпонадобится таблица отношений для каждого продукта и его возможные атрибуты, которые «решают» проблему.
Здесь указывается «Решает», почему вполне возможно, что настоящая проблема - это не проблема, которую пытается решить ОП. Очень распространенная проблема в ИТ-индустрии.
ОБНОВЛЕНИЕ 2
Когда кто-то называет карту "Это традиционное", вы мало что можете сделать.
Конечно, решение является тривиальным для фиксированного числа Variation
.
select v0.Value, v1.Value, v2.Value
from Variation_Attributes v0
join Variation_Attributes v1 on v1.Id != v0.Id
join Variation_Attributes v2 on v1.Id != v0.Id and v2.Id != v1.Id
where v0.VariationId = 1
and v1.VariationId = 2
and v2.VariationId = 3
, оно дает нам все шесть возможностей.
Но для динамического сценария OP должен использовать PIVOT илипостроить запрос динамически. Пример:
declare @index int = 0, @select varchar(max), @from varchar(max), @where varchar(max), @VariationId int;
declare MyLoop cursor fast_forward for (select Id from Variations);
open MyLoop;
fetch next from MyLoop into @VariationId
while @@FETCH_STATUS != -1
begin
if (@index = 0)
begin
set @select = 'select v'+cast(@index as varchar)+'.Value as v'+cast(@index as varchar);
set @from = 'from Variation_Attributes v'+cast(@index as varchar);
set @where = 'where v'+cast(@index as varchar)+'.VariationId = '+cast(@VariationId as varchar);
end
else begin
set @select = @select + ', v'+cast(@index as varchar)+'.Value as v'+cast(@index as varchar);
set @from = @from + ' cross join Variation_Attributes v'+cast(@index as varchar);
set @where = @where + ' and v'+cast(@index as varchar)+'.VariationId = '+cast(@VariationId as varchar);
end
set @index = @index + 1;
fetch next from MyLoop into @VariationId;
end
--print @select;
--print @from;
--print @where;
close MyLoop;
deallocate MyLoop;
exec (@select+' '+@from+' '+@where);
Для данных примера он дает
v0 v1 v2
------- ------- -------
Black Large Tall
Black Small Tall
Black Medium Tall
Red Large Tall
Red Small Tall
Red Medium Tall