CHill60
Если у вас есть несколько описаний наборов, то вместо того, чтобы иметь один большой столбец с этой информацией, имейте отношение "один ко многим" к таблице описаний, например
create table Product(id int, [name] varchar(255),[price] decimal(15,2))
create table Description (id int, description varchar(255))
create table ProductDescription (ProductId int, DescriptionId int)
insert into #Product (id, [name], price) values
(1, 'Product1',100.10), (2, 'Product2', 200.20), (3, 'Product3', 300.30)
insert into #Description (id, [description]) values
(1, 'Baby Product'),(2,'Adult Product')
insert into #ProductDescription(ProductId, DescriptionId) values
(1,1),(1,2),(2,2),(3,1)
Вы можете связать их вот так:
select P.id, P.[name], P.price, D.[Description]
FROM #Product P
INNER JOIN #ProductDescription PD ON PD.ProductID=P.id
INNER JOIN #Description D on D.id=PD.DescriptionId
WHERE D.[Description] = 'Baby Product'
Результаты:
1 Product1 100.10 Baby Product
3 Product3 300.30 Baby Product
Вы можете восстановить "полное описание" продукта, используя для XML-пути, например (возможно, не самый лучший запрос tbh)
;WITH CTE AS
(
select P.id, P.[name], P.price, D.[Description]
FROM #Product P
INNER JOIN #ProductDescription PD ON PD.ProductID=P.id
INNER JOIN #Description D on D.id=PD.DescriptionId
),
CTE1 AS
(
SELECT id, [Description] =
STUFF((SELECT ', ' + CAST([Description] as nvarchar)
FROM [CTE] p1
WHERE p1.id = p2.id
FOR XML PATH('')), 1, 2, '')
FROM CTE p2
GROUP BY id
)
SELECT * from CTE1 A WHERE id IN
(SELECT ProductId FROM #ProductDescription PD INNER JOIN #Description D ON PD.DescriptionId = D.id WHERE D.[Description] = 'Baby Product')
Результаты:
1 Baby Product, Adult Product
3 Baby Product
Производительность по сравнению с вашей исходной схемой или моим предложением потенциально может быть улучшена за счет использования соответствующих индексов