Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Наваждение, какое-то... / 7 сообщений из 7, страница 1 из 1
25.10.2002, 13:43:27
    #32061907
DYV
DYV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
Такое, вот, дело... Постараюсь изложить суть в самом простом виде.
Есть таблица (Т) неких продуктов, выглядящая следующим образом:
CREATE TABLE T(TypeID INT,Code INT)

Предположим, в ней следующие записи:
TypeID Code
0 1
1 1
2 1
1 2
2 2
3 2
4 2
1 3
3 3
Нужен запрос, возвращающий все продукты, "принадлежащие", к примеру TypeID=n1 & TypeID=n2

Вроде, все просто:
SELECT T1.*
FROM T T1
INNER JOIN T T2 ON T1.Code=T2.Code
WHERE T1.TypeID=n1 AND T2.TypeID=n2

Нет у меня трудностей и сделать это при TypeID=n1 & TypeID=n2 & TypeID=n3 & ... Запрос динамический, генерится в СОМе, т.е. - все, вроде, пучком.
Но, "терзают меня смутные сомнения"(С), что можно это сделать как-то красивее, что-ли.
Помогите, пожалуйста... Или развейте мои сомнения, или укрепите их :)
...
Рейтинг: 0 / 0
25.10.2002, 13:47:23
    #32061909
Sanek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
а типа
WHERE TypeID in (1,2)
не подойдет ?
...
Рейтинг: 0 / 0
25.10.2002, 13:49:40
    #32061911
dkstranger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
select * from T where
TypeId=n1 and
code in (select code from T tt where tt.TypeId=n2)
...
Рейтинг: 0 / 0
25.10.2002, 14:00:16
    #32061918
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
Как-нибудь так наверное:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE T(TypeID INT,Code INT) 
insert into t values( 0 ,  1 ) 
insert into t values( 1 ,  1 ) 
insert into t values( 2 ,  1 ) 
insert into t values( 1 ,  2 ) 
insert into t values( 2 ,  2 ) 
insert into t values( 3 ,  2 ) 
insert into t values( 4 ,  2 ) 
insert into t values( 1 ,  3 ) 
insert into t values( 3 ,  3 )

select t1.code from t as t1
inner join (select distinct typeid from t where typeid in ( 1 , 2 , 3 )) as t2
on t1.typeid=t2.typeid
group by t1.code
having count(distinct t1.typeid)= 3 

drop table t

Но можно и пооптимизировать, например (1,2,3) во временную табличку складывать.
...
Рейтинг: 0 / 0
25.10.2002, 15:17:55
    #32061973
DYV
DYV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
По порядку :)

- 2 Sanek:
Абсолютно не подойдет! :)

- 2 dkstranger:
Тут я виноват... послал ОДНО из возможных ОФОРМЛЕНИЙ запроса. Совершенно те же яйца, совершенно в тот же профиль... с тем же планом (естественно). Но, спасибо, конечно.

- 2 VVG:
Красивее же хотелось! :) Ну, и "в реале" таблица, конечно же, большая... Групповые операции не катят. Прошу прощения, даже не проверял Ваш вариант...

Еще раз - БОЛЬШОЕ СПАСИБО ответившим!
...
Рейтинг: 0 / 0
25.10.2002, 16:19:03
    #32062011
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
А Вы считаете, что перемножение таблицы на саму себя столько раз, сколько параметров в запросе будет быстрее одной группировки (теперь даже без join'а)?

Код: plaintext
1.
2.
select t1.code from t as t1 where typeid in ( 1 , 2 , 3 )
group by t1.code
having count(distinct t1.typeid)= 3 
...
Рейтинг: 0 / 0
25.10.2002, 17:51:24
    #32062042
DYV
DYV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наваждение, какое-то...
Каюсь, каюсь... Неплохое решение (тьфу, ХОРОШЕЕ :))
Но, согласитесь, в этой редакции (без JOINа) - запрос-то и по-другому выглядит... Красиво :)

Еще раз, спасибо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Наваждение, какое-то... / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]