powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос
10 сообщений из 10, страница 1 из 1
Запрос
    #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
Запрос
    #32045810
Faza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй для этого использовать виды.
Один вид - условно говоря #t1, второй - #t2.
Потом строишь выборку используя не таблицы, а виды.
...
Рейтинг: 0 / 0
Запрос
    #32046170
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что? Больше ни у кого никаких идей?
...
Рейтинг: 0 / 0
Запрос
    #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
Запрос
    #32046336
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон....
Код: plaintext
create unique clustered index CIX_vw on vw(typeid,id1)
...
Рейтинг: 0 / 0
Запрос
    #32046553
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял... Речь идет о SQLS7. Соответсвенно ключевого слова "schemabinding" - не существует.

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

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

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

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


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