Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Список атрибутов  [new]
robbit
Member

Откуда:
Сообщений: 18
Помогите, не могу сообразить.

Имеется таблица товаров:

create table Good (GoodId int, Name varchar(100))

и таблица атрибутов товаров

create table Attrib (AttrId int, GoodId, Type int, Attr int)

Как для заданного товара одним запросом получить
список товаров обладающих идентичной комбинацией атрибутов?
26 июн 03, 10:38    [242208]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Может так?

SELECT

A.GoodID
FROM
A
LEFT JOIN
(SELECT Attr
FROM Attrib
WHERE GoodID = @SomeGodeID) AS A1 ON
A.Attr = A1.Attr
GROUP BY
A.GoodID
HAVING
COUNT(A.GoodID) = SUM(CASE WHEN A1.Attr IS NOT NULL THEN 1 END)
26 июн 03, 11:42    [242334]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
robbit
Member

Откуда:
Сообщений: 18
2 pkarklin
Спасибо за идею, но ваш вариант не всегда правильно работает.

У меня в результате получилось довольно корявое решение


declare @SomeGoodId int
set @SomeGoodId = 1

declare @Cnt int
select @Cnt = count(*) from Attrib where GoodId = @SomeGoodId

select GoodId from Attrib
where Attr in (select Attr from Attrib where GoodId=@SomeGoodId)
group by GoodId having count(*)=@Cnt


Может кто лучше придумает.
27 июн 03, 10:55    [243906]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
но ваш вариант не всегда правильно работает.

Не всегда, это когда? МОжно объяснить. Или я постановку не правильно понял?
27 июн 03, 10:57    [243913]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Ну или в чем я ошибся.
27 июн 03, 11:04    [243928]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Кажись дошло. Мой вариант не будет работать для случая, когда атрибуты товара составляют подмножество аттрибутов заданного товара. Тогда может так:
SELECT

A.GoodID
FROM
A
FULL OUTER JOIN
(SELECT Attr
FROM Attrib
WHERE GoodID = @SomeGodeID) AS A1 ON
A.Attr = A1.Attr
GROUP BY
A.GoodID
HAVING
SUM(CASE WHEN A.Attr IS NOT NULL THEN 1 END) = COUNT(*) AND
SUM(CASE WHEN A1.Attr IS NOT NULL THEN 1 END) = COUNT(*)
27 июн 03, 11:23    [243967]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
robbit
Member

Откуда:
Сообщений: 18
2 pkarklin
ОК, теперь работает. Спасибо.

Есть еще одна задача: по заданному набору атрибутов найти список товаров обладающих ими всеми одновременно.
27 июн 03, 11:39    [243991]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Ну а список этих аттрибутов откуда береться? Можно положить эти аттрибуты во временную таблицу и заменить вложенный запрос на выборку из этой временной таблицы или SELECT 1 UNION ALL SELECT 2... написать, если надо с клиента запрос послать.
27 июн 03, 11:49    [244003]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
robbit
Member

Откуда:
Сообщений: 18
Да список атрибутов лежит во временной таблице типа #tmp (Attr int)
27 июн 03, 12:02    [244037]     Ответить | Цитировать Сообщить модератору
 Re: Список атрибутов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
SELECT

A.GoodID
FROM
A
FULL OUTER JOIN
(SELECT Attr
FROM #tmp) AS A1 ON
A.Attr = A1.Attr
GROUP BY
A.GoodID
HAVING
SUM(CASE WHEN A.Attr IS NOT NULL THEN 1 END) = COUNT(*) AND
SUM(CASE WHEN A1.Attr IS NOT NULL THEN 1 END) = COUNT(*)


Это если надо строгое соответсвие аттрибутов. Или еще и по подмножеству надо?
27 июн 03, 12:10    [244053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить