Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос / 10 сообщений из 10, страница 1 из 1
26.08.2002, 10:47:57
    #32045805
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Есть 2 таблицы: склад и реквизиты товара.

В таблице склада есть 2 кода: код товара и код типа товара.

В таблице реквизитов 2 поля: название реквизита и значение реквизита. Ну и ссылка на код товара на складе.

Для заданного значения кода и типа товара необходимо получить выборку состоящую из 2 полей: название реквизита, значение реквизита.

Проблема в том, что в столбце названий должны присутствовать все уникальные значения названий хотя бы раз использовавшиеся для данного типа товара.

Чтобы было понятно о чем речь привожу скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table #t1 (id1 int, typeid int)
insert into #t1 values ( 1 , 1 )
insert into #t1 values ( 2 , 1 )
insert into #t1 values ( 3 , 2 )

create table #t2 (id2 int, id1 int, propName char( 10 ), propValue char( 10 ))
insert into #t2 values ( 1 , 1 , "name1" , "name1_val1" )
insert into #t2 values ( 2 , 1 , "name2" , "name2_val1" )
insert into #t2 values ( 3 , 2 , "name1" , "name1_val2" )
insert into #t2 values ( 4 , 3 , "name1" , "name1_val3" )

declare @id1 int, @typeid int
set @id1= 2 
set @typeid= 1 

select a.propName,MAX(c.propValue) as propValue
from #t2 a 
INNER JOIN #t1 b ON a.id1=b.id1 AND b.typeid=@typeid
LEFT JOIN #t2 c ON a.id2=c.id2 AND c.id1=@id1
GROUP BY a.propName


Это все работает, но есть большая проблема.

В данном примере я привел условную структуру таблиц #t1 и #t2, чтобы была понятна суть вопроса. В реальной базе данных #t1 - это результат объединения 3 таблиц (по INNER JOIN), а #t2 - это объединение других 3 таблиц (также по INNER JOIN). Поэтому использовать подобный запрос становится крайне затруднительно.

Результатом выборки в реальной базе данных является набор не более чем из 10 записей. Может быть имеет смысл делать 2 отдельных запроса, а объединение делать уже на клиенте?
...
Рейтинг: 0 / 0
26.08.2002, 10:57:53
    #32045810
Faza
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Попробуй для этого использовать виды.
Один вид - условно говоря #t1, второй - #t2.
Потом строишь выборку используя не таблицы, а виды.
...
Рейтинг: 0 / 0
27.08.2002, 13:40:07
    #32046170
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Так что? Больше ни у кого никаких идей?
...
Рейтинг: 0 / 0
27.08.2002, 18:53:56
    #32046330
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create table #t1 (id1 int, typeid int)
insert into #t1 values ( 1 , 1 )
insert into #t1 values ( 2 , 1 )
insert into #t1 values ( 3 , 2 )

create table #t2 (id2 int, id1 int, propName char( 10 ), propValue char( 10 ))
insert into #t2 values ( 1 , 1 , "name1" , "name1_val1" )
insert into #t2 values ( 2 , 1 , "name2" , "name2_val1" )
insert into #t2 values ( 3 , 2 , "name1" , "name1_val2" )
insert into #t2 values ( 4 , 3 , "name1" , "name1_val3" )

create view vw
with schemabinding
as 
select b.typeid,c.id1,a.propName,MAX(c.propValue) as propValue
from #t2 a 
INNER JOIN #t1 b ON a.id1=b.id1 
LEFT JOIN #t2 c ON a.id2=c.id2 
GROUP BY b.typeid,c.id1,a.propName

create unique clustered index CIX_vw(typeid,id1)

declare @id1 int, @typeid int
set @id1= 2 
set @typeid= 1 

select a.propName,c.propValue
from vw
where typeid=@typeid and  id1=@id1
...
Рейтинг: 0 / 0
27.08.2002, 19:03:21
    #32046336
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
пардон....
Код: plaintext
create unique clustered index CIX_vw on vw(typeid,id1)
...
Рейтинг: 0 / 0
28.08.2002, 15:25:40
    #32046553
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Не понял... Речь идет о SQLS7. Соответсвенно ключевого слова "schemabinding" - не существует.

Предполагается, что во View просто запоминается план составленного запроса? Чем это лучше обычной ХП?
...
Рейтинг: 0 / 0
28.08.2002, 15:29:41
    #32046557
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
не знал я что это 7....
тогда пример не для Вас... индексированные представления хорошая штука.....
...
Рейтинг: 0 / 0
29.08.2002, 10:35:58
    #32046726
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
Все-равно не понял...
Пусть даже я смог бы каким-нибудь хитрым образом создать индексированный View в 7 (или его аналог). Каким образом это помогло бы в моей проблеме?
...
Рейтинг: 0 / 0
29.08.2002, 11:07:07
    #32046741
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
во блин.... индексированое представление всегда содержит актуальные данные....
не нужены ни таблица с промежуточными данными,ни тригер ее поддерживающий...
...
Рейтинг: 0 / 0
29.08.2002, 13:08:00
    #32046800
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос
А не индексированное представление, стало быть, иногда содержит неактульные данные? Что ж, ценное замечание.

Только вопрос-то был о другом.

Фактически, вопрос стоит так: можно ли получить нужную мне выборку, используя #t1 и #t2 только один раз в качестве источников данных.

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


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