T-SQL - выбор атрибутов условий в таблице - PullRequest
2 голосов
/ 16 марта 2019

У меня проблемы с поиском по нескольким условиям.

Пример: вы хотите купить обувь с атрибутами "Color Red" и "Size 10".

В моем результате я надеваюне знаю, как снять туфли, которые имеют только нужный цвет или размер (я имею в виду: я хочу выбрать только туфли, которые имеют все атрибуты).

Declare @Tbl_Atributes Table
                       (
                            [NameAttribute] nvarchar(250),
                            [ValueAttribute] nvarchar(250)
                       )

Declare @Tbl_Product Table
                     (
                        [Code] int,
                        [Name] nvarchar(250),
                        [NameAttribute] nvarchar(250),
                        [ValueAttribute] nvarchar(250)
                     )

Insert Into @Tbl_Atributes 
values ('Color', 'Red'), ('Size', '10')

Insert Into @Tbl_Product ([Code], [Name], [NameAttribute], [ValueAttribute])
values ('1', 'Nike', 'Color', 'Red'),
       ('1', 'Nike', 'Color', 'Blue'),
       ('1', 'Nike', 'Size', '10'),
       ('2', 'Adidas', 'Size', '10')

Я хочу, чтобы товары имели все NameAttributeв @Tbl_Atributes.

Моя первая попытка:

select tp.*
from @Tbl_Product tp
inner join @Tbl_Atributes as ta on tp.NameAttribute = ta.NameAttribute
                                and tp.ValueAttribute = ta.ValueAttribute

Я столкнулся с проблемой: у продукта Adidas есть 1 атрибут Name: 'Size', и он все еще в результате.(Нам нужно 2 атрибута Имя: размер и цвет, только у Nike есть все)

Пожалуйста, помогите мне решить.Спасибо.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы можете использовать EXISTS:

select distinct [Code], [Name] from Tbl_Product t
where
  exists (
    select 1 from Tbl_Product 
    where [Code] = t.[Code] and [NameAttribute] = 'Color' and [ValueAttribute] = 'Red'
  )
  and 
  exists (
    select 1 from Tbl_Product 
    where [Code] = t.[Code] and [NameAttribute] = 'Size' and [ValueAttribute] = '10'
  )

См. Демоверсию Редактировать :Чтобы получить продукты, которые имеют все атрибуты от Tbl_Atributes:

select distinct [Code], [Name] from Tbl_Product t
where
(select count(distinct [NameAttribute]) from Tbl_Product where [Code] = t.[Code]) =
(select count(distinct [NameAttribute]) from Tbl_Atributes) 

См. Демонстрационную версию Edit2 :Для лучшей производительности используйте CTE:

with cte as (
  select count(distinct [NameAttribute]) total from Tbl_Atributes
)
select [Code], [Name] from Tbl_Product t
group by [Code], [Name]
having count(distinct [NameAttribute]) = (select total from cte)

См. demo Вы можете заменить count(distinct [NameAttribute]) на count(*), если для продукта нет случая повторного атрибута.

0 голосов
/ 16 марта 2019

Я нашел такое решение;

Declare @Tbl_Atributes Table(
[NameAttribute] nvarchar(250)
,[ValueAttribute] nvarchar(250))

Declare @Tbl_Product Table(
    [Code] int,
    [Name] nvarchar(250),
    [NameAttribute] nvarchar(250)
    ,[ValueAttribute] nvarchar(250))

Insert Into @Tbl_Atributes values ('Color', 'Red'), ('Size', '10')

Insert Into @Tbl_Product  ([Code],[Name], [NameAttribute], [ValueAttribute])
values ('1','Nike','Color','Red'),('1','Nike','Color','Blue'),('1','Nike','Size','10')
        ,('2','Addidas','Size','10')


select tmp.* 
from (select tp1.Code, tp1.Name
        from @Tbl_Product tp1 
        group by tp1.Code,tp1.Name) as tmp    
where (select COUNT(1) from @Tbl_Atributes)=
        (select count(1) 
        from @Tbl_Product tp
        join @Tbl_Atributes ta on tp.NameAttribute=ta.NameAttribute and tp.ValueAttribute=ta.ValueAttribute
        where tp.Code=tmp.Code)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...