Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) громоздкий запрос (число прочтений - 8154 )
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
громоздкий запрос
16. Июня 2009 :: 06:56
Печать  
Имеется достаточно громоздкий запрос.

ТекстЗапроса=ТекстЗапроса+"  
//Товар    
|Товар=Справочник.Товары.ТекущийЭлемент,
|Регистр.ОстаткиТоваров.Товар,
|Регистр.Закупки.Товар,
|Регистр.ВозвратыПоставщику.Товар,
|Регистр.Продажа.Товар,
|Регистр.ВозвратПокупателя.Товар,                    
|Регистр.Списания.Товар,
|Регистр.Комиссия.Товар,
|Регистр.Заказы.Товар,        
|Регистр.Clients_Account.Goods,
|Регистр.Расчет.Goods,      
|Регистр.ВозвратДенег.Goods;  
//Поставщик  
|Поставщик=Справочник.Товары.ТекущийЭлемент.Поставщик,
|Регистр.ОстаткиТоваров.Товар.Поставщик,
|Регистр.Закупки.Товар.Поставщик,
|Регистр.ВозвратыПоставщику.Товар.Поставщик,
|Регистр.Продажа.Товар.Поставщик,
|Регистр.ВозвратПокупателя.Товар.Поставщик,                    
|Регистр.Списания.Товар.Поставщик,
|Регистр.Комиссия.Товар.Поставщик,
|Регистр.Заказы.Товар.Поставщик,
|Регистр.Clients_Account.Goods.Поставщик,
|Регистр.Расчет.Goods.Поставщик,
|Регистр.ВозвратДенег.Goods.Поставщик;
//Склад
|Склад=Регистр.ОстаткиТоваров.Склад,
|Регистр.Закупки.Склад,
|Регистр.ВозвратыПоставщику.Склад,
|Регистр.Продажа.Склад,
|Регистр.ВозвратПокупателя.Склад,                    
|Регистр.Списания.Склад;
//Количество
|ОстКол=     Регистр.ОстаткиТоваров.ОстатокТовара;
|ОстЗак=     Регистр.Закупки.ОстатокТовара;
|ОстВозПост= Регистр.ВозвратыПоставщику.ОстатокТовара;
|ОстПрод=    Регистр.Продажа.ОстатокТовара;
|ОстВозПокуп=Регистр.ВозвратПокупателя.ОстатокТовара;
|ОстСпис=    Регистр.Списания.ОстатокТовара;
|КомисСбор=    Регистр.Комиссия.Комиссия;
|Зак=        Регистр.Заказы.Количество;
|Ф_Ост_Кол=  Регистр.Clients_Account.quantity;
|ФО_Ост_Кол=  Регистр.Расчет.quantity;
|ФВ_Ост_Кол=  Регистр.ВозвратДенег.quantity;
//Сумма
|ОстКолС=     Регистр.ОстаткиТоваров.БазоваяСтоимость;
|ОстЗакС=     Регистр.Закупки.БазоваяСтоимость;
|ОстВозПостС= Регистр.ВозвратыПоставщику.ВалютнаяСтоимость;
|ОстПродС=    Регистр.Продажа.ВалютнаяСтоимость;
|ОстВозПокупС=Регистр.ВозвратПокупателя.ВалютнаяСтоимость;
|ОстСписС=    Регистр.Списания.ВалютнаяСтоимость;
|Cl_am = Регистр.Clients_Account.Client_Amount;
|Cl_am_O = Регистр.Расчет.Client_Amount;
|Cl_am_В = Регистр.ВозвратДенег.Client_Amount;
//Баланс по продажам
|ОстПродСБ=    Регистр.Продажа.БалСтоимость;
|ОстВозПокупСБ=Регистр.ВозвратПокупателя.БалСтоимость;
|Cst = Регистр.Clients_Account.Cost;
|Cst_O = Регистр.Расчет.Cost;
|Cst_В = Регистр.ВозвратДенег.Cost;
|";          
ТекстЗапроса=ТекстЗапроса+"
|Функция КОстКол=  КонОст(ОстКол);
|Функция НОстКол=  НачОст(ОстКол);
|Функция КОстКолС= КонОст(ОстКолС);
|Функция НОстКолС= НачОст(ОстКолС);
|Функция КЗак=     КонОст(Зак);
|Функция КОст_Ф =  КонОст(Ф_Ост_Кол);
|Функция НОст_Ф =  НачОст(Ф_Ост_Кол);
|Функция КОст_ФС = КонОст(Cl_am);
|Функция НОст_ФС = НачОст(Cl_am);
|Функция КОст_ФБ = КонОст(Cst);
|Функция НОст_ФБ = НачОст(Cst);
// Деньги приход
|Функция КОБ_Ф =   КонОст(ФО_Ост_Кол);
|Функция КОБ_ФС =  КонОст(Cl_am_O);
|Функция КОБ_ФБ =  КонОст(Cst_O);
|Функция НОБ_Ф =   НачОст(ФО_Ост_Кол);
|Функция НОБ_ФС =  НачОст(Cl_am_O);
|Функция НОБ_ФБ =  НачОст(Cst_O);
// Деньги возврат
|Функция КВБ_Ф =   КонОст(ФВ_Ост_Кол);
|Функция КВБ_ФС =  КонОст(Cl_am_В);
|Функция КВБ_ФБ =  КонОст(Cst_В);
|Функция НВБ_Ф =   НачОст(ФВ_Ост_Кол);
|Функция НВБ_ФС =  НачОст(Cl_am_В);
|Функция НВБ_ФБ =  НачОст(Cst_В);
// Закупки
|Функция ООстЗак=  Сумма(ОстЗак);
//|Функция НОстЗак=  НачОст(ОстЗак);
|Функция ООстЗакС= Сумма(ОстЗакС);
//|Функция НОстЗакС= НачОст(ОстЗакС);
// Возвраты Поставщику
|Функция КОстВозПост=  КонОст(ОстВозПост);
|Функция НОстВозПост=  НачОст(ОстВозПост);
|Функция КОстВозПостС= КонОст(ОстВозПостС);
|Функция НОстВозПостС= НачОст(ОстВозПостС);
//Продажи                                
|Функция КОстПрод=   КонОст(ОстПрод);
|Функция НОстПрод=   НачОст(ОстПрод);
|Функция КОстПродС=  КонОст(ОстПродС);
|Функция НОстПродС=  НачОст(ОстПродС);
|Функция КОстПродСБ= КонОст(ОстПродСБ);
|Функция НОстПродСБ= НачОст(ОстПродСБ);
// Возвраты покупателей
|Функция КОстВозПокуп=   КонОст(ОстВозПокуп);
|Функция НОстВозПокуп=   НачОст(ОстВозПокуп);
|Функция КОстВозПокупС=  КонОст(ОстВозПокупС);
|Функция НОстВозПокупС=  НачОст(ОстВозПокупС);
|Функция КОстВозПокупСБ= КонОст(ОстВозПокупСБ);
|Функция НОстВозПокупСБ= НачОст(ОстВозПокупСБ);
// Комиссия
|Функция НКом=     НачОст(КомисСбор);
|Функция ККом=     КонОст(КомисСбор);
// Списания
|Функция КОстСпис=  КонОст(ОстСпис);
|Функция НОстСпис=  НачОст(ОстСпис);
|Функция КОстСписС= КонОст(ОстСписС);
|Функция НОстСписС= НачОст(ОстСписС);
|";    
плюс всякие условия и группировки.

Вопрос. Как его наименнее геморойно перевести в прямой запрос?

Видится через Union по каждому отдельному регистру. Но возможно есть метод оптимальней?
Можно ли это сделать автоматически Плагином для OpenConf, аналог конструктора запросов 1Cv8?
(вот этим http://www.1cpp.ru/forum/YaBB.pl?num=1148127139/0)
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: громоздкий запрос
Ответ #1 - 16. Июня 2009 :: 07:10
Печать  
Bibr писал(а) 16. Июня 2009 :: 06:56:
Имеется достаточно громоздкий запрос.
...
плюс всякие условия и группировки.

Вопрос. Как его наименнее геморойно перевести в прямой запрос?

Видится через Union по каждому отдельному регистру. Но возможно есть метод оптимальней?
Можно ли это сделать автоматически Плагином для OpenConf, аналог конструктора запросов 1Cv8?
(вот этим http://www.1cpp.ru/forum/YaBB.pl?num=1148127139/0)


Руками.
Смотря какой объем и что в результате нужно получить. Возможно придется выполнять отдельными запросами закидывая во временную таблицу, а может и сразу все. Смотреть нужно...
Попробуй. Я поначалу также плагином пользовался - сейчас проще самому писать.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #2 - 16. Июня 2009 :: 07:58
Печать  
Дык вот интересно, как руками.

Можно попробовать через COALESCE, можно через Union.
Может еще варианты есть, но пока не вижу.
установил конструктор, ковыряюсь. но пока переводчика из 1С  в прямые запросы не увидел. Видимо его и нет.
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: громоздкий запрос
Ответ #3 - 16. Июня 2009 :: 08:07
Печать  
Ну дык если тяжко понимается то делай сначала отдельные селекты по каждому регистру. Дальше пробуй объединить.
Могу сразу сказать что //Поставщик у тебя явно лишняя секция, т.к. ты берешь его из справочника Товары и соответственно можешь приджойнить в конце запроса. Ну и т.д.
В общем - пробуй. Мы все когда-то начинали...
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #4 - 16. Июня 2009 :: 08:30
Печать  
Я-то думал мне тут щас готовенький запрос сразу...  Смех
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: громоздкий запрос
Ответ #5 - 16. Июня 2009 :: 08:33
Печать  
Форумы для того что-бы помочь а не сделать за тебя работу. Так что ты слегка промахнулся.  Улыбка
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: громоздкий запрос
Ответ #6 - 16. Июня 2009 :: 11:08
Печать  
Bibr писал(а) 16. Июня 2009 :: 07:58:
Дык вот интересно, как руками.

Можно попробовать через COALESCE, можно через Union.
Может еще варианты есть, но пока не вижу.
установил конструктор, ковыряюсь. но пока переводчика из 1С  в прямые запросы не увидел. Видимо его и нет.

только не union а  union all.
Если начало периода это начало месяца а конец периода то написать не очень сложно на основе только rg таблиц
(иначе объеденять с ra несколько муторно но тоже вполне возможно ).
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #7 - 17. Июня 2009 :: 08:32
Печать  
Есть у меня 2 запроса по разным регистрам:
Код
Выбрать все
	ТекстЗ = "
	|SELECT                    
	|	Рег.Товар as [Товар $Справочник.Товары],
	|	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	|	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	|	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	|	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
	|FROM
	|	Склад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег
	|ORDER BY
	|	Рег.Товар
	|";       



и

Код
Выбрать все
	ТекстЗ = "
	|SELECT                    
	|	Рег.Товар as [Товар $Справочник.Товары],
	|	Рег.ВалютнаяСтоимостьНачальныйОстаток as НОстВозПостС,  
	|	Рег.ВалютнаяСтоимостьКонечныйОстаток as КОстВозПостС,
	|	Рег.ОстатокТовараНачальныйОстаток as НОстВозПост,  
	|	Рег.ОстатокТовараКонечныйОстаток as КОстВозПост
	|FROM
	|	,ВыбСклад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (ВалютнаяСтоимость,ОстатокТовара)) as Рег
	|ORDER BY
	|	Рег.Товар
	|";      
 



Они работают.
как теперь объединить их в один?
Union не подходит, т.к. набор полей разный.

т.к. по одному товару могут быть движения по одному регистру, а по другому - по другом, И нужны все данные, то предполагаю что поможет мне FULL JOIN.
Тогда:
Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар IN (SELECT Val FROM #ВыбТовар)),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар IN (SELECT Val FROM #ВыбТовар)),(Товар), (БазоваяСтоимость,ОстатокТовара)) ) as Рег1 ON (Рег.Товар = Рег1.Товар) 



но выдает ошибку:
The column prefix 'Рег1' does not match with a table name or alias name used in the query.

Подскажите в чем ошибка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: громоздкий запрос
Ответ #8 - 17. Июня 2009 :: 09:08
Печать  
Код
Выбрать все
SELECT
|   Подзапрос.Товар as [Товар $Справочник.Товары],
|   SUM(Подзапрос.НОстКолС) as НОстКолС,
|   SUM(Подзапрос.НОстВозПостС) as НОстВозПостС
| FROM
|(
|SELECT			  
|	Рег.Товар as Товар ,
|	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
|	 0 as  НОстВозПостС
|FROM
|	Склад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег
|UNION ALL
|SELECT			  
|	Рег2.Товар ,
|	 0 ,	  
|	Рег2.ВалютнаяСтоимостьНачальныйОстаток  
|
|FROM
|	,ВыбСклад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (ВалютнаяСтоимость,ОстатокТовара)) as Рег2
|) as Подзапрос
|GROUP BY Подзапрос.Товар 



для простоты 2 остатка.
аналогично много функций и много таблиц
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: громоздкий запрос
Ответ #9 - 17. Июня 2009 :: 09:14
Печать  
Код
Выбрать все
 ON (Рег1.Товар = Рег.Товар)
 

  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #10 - 17. Июня 2009 :: 09:24
Печать  
kiruha писал(а) 17. Июня 2009 :: 09:08:
для простоты 2 остатка.
аналогично много функций и много таблиц


да, похожий вариант на форуме находил. еще не пробовал его реализовывать, т.к. у меня 11 регистров и итого 47 полей остатков.
11*47 = 517 строк, из которых 450 будет типа "0 as ..."
Некрасиво получится.
Хочу все-таки сначала так попробовать. не получится - сделаю через Union.

leov-001 писал(а) 17. Июня 2009 :: 09:14:
Код
Выбрать все
 ON (Рег1.Товар = Рег.Товар)
 



так в чем ошибка? две таблицы, два поля. что не так?
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #11 - 17. Июня 2009 :: 10:14
Печать  
Не вижу разницы например с этим:
Способ 2: Если флаг не стоит
Код
Выбрать все
ТекстЗапроса = "
|SELECT
|    Рег.IDDoc as [Док $Документ],
|    Жур.IDDocDef as Док_вид,
|    $Рег.Склад as [Склад $Справочник.Склады],
|    $Рег.Товар as [Товар $Справочник.Номенклатура],
|    $Рег.Количество as Количество
|FROM
|    $Регистр.ОстаткиТоваров as Рег
|INNER JOIN
|    _1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
|WHERE
|    Рег.IDDoc = :ВыбДок"; 



вроде бы точно такой же join.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: громоздкий запрос
Ответ #12 - 17. Июня 2009 :: 11:20
Печать  
Bibr писал(а) 17. Июня 2009 :: 09:24:
leov-001 писал(а) 17. Июня 2009 :: 09:14:
Код
Выбрать все
 ON (Рег1.Товар = Рег.Товар)
 



так в чем ошибка? две таблицы, два поля. что не так?


Джойниш Рег1 так ипиши его первым.

Код
Выбрать все
_1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc

 



Здесь ведь правильно приДжойнил
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #13 - 17. Июня 2009 :: 14:20
Печать  
Увы, проблему не решило.

Правда ошибка изменилась:
The column prefix 'Рег1' does not match with a table name or alias name used in the query.

запрос такой:
Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) ) as Рег1 ON (Рег1.Товар = Рег.Товар) 

  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #14 - 17. Июня 2009 :: 15:18
Печать  
Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) Рег1) as Рег1 ON (Рег1.Товар = Рег.Товар)

 


зы: я б делал через union all. И там же у вас еще группировки по Складу и поставщику. Почему джойн только по Товару тогда? А склад не во всех регистрах есть. гм Озадачен
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #15 - 17. Июня 2009 :: 15:28
Печать  
Спасибо1

Поставщик - реквизит товара, поэтому JOIN к общей потом сделаю и по поставщику GROUP BY будет. А склад нужен только для фильтрации на уровне РегистрОстаткиОбороты.

Если через Join не выйдет сделаю через Union. Но пока хочу проверить на жизнеспособность этот вариант
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: громоздкий запрос
Ответ #16 - 17. Июня 2009 :: 20:27
Печать  
вместо Рег.Товар as [Товар $Справочник.Товары]

coalesce(Рег.Товар, Рег1.Товар) as [Товар $Справочник.Товары]

у тебя же full join
http://msdn.microsoft.com/ru-ru/library/ms190349.aspx
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #17 - 18. Июня 2009 :: 06:27
Печать  
kiruha писал(а) 17. Июня 2009 :: 20:27:
вместо Рег.Товар as [Товар $Справочник.Товары]

coalesce(Рег.Товар, Рег1.Товар) as [Товар $Справочник.Товары]

у тебя же full join
http://msdn.microsoft.com/ru-ru/library/ms190349.aspx



Сейчас код дошел до такого:

Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол,
	Рег.ООстЗакС,
	Рег.ООстЗак
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег1) as ВРег1 ON (ВРег1.Товар = Рег.Товар)
 



Пошагово:
1. формируется Рег1: Товар,БазоваяСтоимостьОборот,ОстатокТовараОборот,...
2. из нее выбирается Врег1, состоящая из 3х столбцов Товар,ООстЗакС,ООстЗак.
3. Врег1 присоединяется к Рег (Товар,БазоваяСтоимостьНачальныйОстаток,БазоваяСтоимостьКонечныйОстаток,...)  по полю Товар, которое есть и там и там. Из итоговой таблицы выбираются поля Товар, НОстКолС, КОстКолС, НОстКол, КОстКол, ООстЗакС, ООстЗак.

выдает ошибку:
Invalid column name 'Товар'.

а зачем делать coalesce(Рег.Товар, Рег1.Товар) можете пояснить?
У меня же по этому полю идет join - оно же одно общее

  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #18 - 18. Июня 2009 :: 06:56
Печать  
Все, спасибо! Разобрался.

coalesce там не нужен - были другие ошибки.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #19 - 18. Июня 2009 :: 07:23
Печать  
Bibr писал(а) 18. Июня 2009 :: 06:56:
coalesce там не нужен - были другие ошибки.

нужен-нужен) почитайте про Full Outer Join
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #20 - 18. Июня 2009 :: 07:36
Печать  
alexdd писал(а) 18. Июня 2009 :: 07:23:
Bibr писал(а) 18. Июня 2009 :: 06:56:
coalesce там не нужен - были другие ошибки.

нужен-нужен) почитайте про Full Outer Join



ну не знаю, - столбец товар у меня ж общий.
пока вроде работает, тестирую...

а где почитать не подскажете?
  
Наверх
 
IP записан
 
Roman N Bugrov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 17. Июня 2009
Re: громоздкий запрос
Ответ #21 - 18. Июня 2009 :: 07:41
Печать  
Books OnLine  Подмигивание
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #22 - 18. Июня 2009 :: 07:48
Печать  
а где его взять на русском?
  
Наверх
 
IP записан
 
Roman N Bugrov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 17. Июня 2009
Re: громоздкий запрос
Ответ #23 - 18. Июня 2009 :: 07:56
Печать  
скачать с сайта microsoft, хотя зачем он на русском и так все понятно. можно еще почитать MSDN
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: громоздкий запрос
Ответ #24 - 18. Июня 2009 :: 08:03
Печать  
Bibr писал(а) 18. Июня 2009 :: 07:36:
alexdd писал(а) 18. Июня 2009 :: 07:23:
Bibr писал(а) 18. Июня 2009 :: 06:56:
coalesce там не нужен - были другие ошибки.

нужен-нужен) почитайте про Full Outer Join



ну не знаю, - столбец товар у меня ж общий.
пока вроде работает, тестирую...

а где почитать не подскажете?


Если у тебя в первой таблице не будет товара с остатками, а во второй будет товар с закупками -
твой код приведет что Рег.Товар будет NULL
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #25 - 18. Июня 2009 :: 08:16
Печать  
kiruha писал(а) 18. Июня 2009 :: 08:03:
Если у тебя в первой таблице не будет товара с остатками, а во второй будет товар с закупками -
твой код приведет что Рег.Товар будет NULL


а разве такое может быть при условии, что объединение у меня по полю товар?
я считал, что Full join = left + right.

Т.Е. у меня же условие join - это равенство товаров. как он присоединит пустой товар? это нарушит условие присоединения
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #26 - 18. Июня 2009 :: 08:18
Печать  
почитал про full join здесь:
http://msdn.microsoft.com/ru-ru/library/ms191494(SQL.90).aspx

противоречия с моими представлениями не нашел
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #27 - 18. Июня 2009 :: 08:33
Печать  
пример
Код
Выбрать все
declare @a table(id int not null,somedata char(1) not null primary key(id))
declare @b table(id int not null,somedata char(1) not null primary key(id))

insert into @a select 1,'A' union all select 2,'B'
insert into @b select 1,'A' union all select 3,'C'

select
 a.id		     a_id,
 coalesce(a.id,b.id)  id,
 a.somedata,
 b.somedata
from
 @a a
full join
 @b b on b.id = a.id 

  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #28 - 18. Июня 2009 :: 11:53
Печать  
Объясните тогда кто может на словах а не с посылом по ссылке, что же делают JOINы. Почему необходимо применять coalesce ведь поле одно???
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #29 - 18. Июня 2009 :: 12:07
Печать  
почему же одно когда два
вот еще ссылка http://msdn.microsoft.com/ru-ru/library/ms187518.aspx
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #30 - 18. Июня 2009 :: 12:34
Печать  
Прочитал. Все равно не понимаю. На пальцах.
Таблица Рег
Товар      БазСтоим
1      2.0
2      2.1
3      2.2

Теблица ВРег1
Товар      ВалСтоим
1      3.0
2      3.1
4      3.2
мои представления об операторе Join таковы:

select Товар,БазСтоим,ВалСтоим from Рег left Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       0

select Товар,БазСтоим,ВалСтоим from Рег right Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
4      0       3.2

select Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       0
4      0       3.2

поле Товар у нас одно.
Объясните, в чем я не прав
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #31 - 18. Июня 2009 :: 12:44
Печать  
select Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар
даст таблицу
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       0
4      0       3.2

1. такой запрос ругнется на поле "товар", т.к. это поле есть в Рег и в Врег1
2. Если написать
select Рег1.Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар
получим
Товар      БазСтоим ВалСтоим      
1      2.0       3.0
2      2.1       3.1
3      2.2       NULL
NULL  NULL   3.2

вы пример мой пробовали запускать в QA?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #32 - 18. Июня 2009 :: 12:50
Печать  
зы: тока ж не fool join:)
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #33 - 18. Июня 2009 :: 13:01
Печать  
хм... начинаю понимать.
тогда
1 select Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар ругнется на все три по сути. Да?
2. ваш пример - select Рег1.Товар,БазСтоим,ВалСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар ругнется на БазСтоим,ВалСтоим.
3. select рег.Товар,рег.БазСтоим,рег.ВалСтоим from Рег right Join Врег1 on рег.товар = врег1.товар ругнется на ВалСтоим, т.к. в Рег этого поля нет.

и единственно верно
select coalesce(рег.Товар,врег1.товар) as товар ,рег.БазСтоим,рег.ВалСтоим from Рег right Join Врег1 on рег.товар = врег1.товар.

тогда можно еще пару вопросов.
1. как делать Group by по товару?
2. что будет при Joinе если у таблиц совпадает несколько полей? например Товар и ВалСт?
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #34 - 18. Июня 2009 :: 13:02
Печать  
alexdd писал(а) 18. Июня 2009 :: 12:50:
зы: тока ж не fool join:)

Смех да, точно. это немного другое слово

  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #35 - 18. Июня 2009 :: 13:12
Печать  
упс, да сорь. Рег1 там нет, не заметилУлыбка
насчет group by:
Код
Выбрать все
select
 coalesce(рег.Товар,врег1.товар) as товар,
 sum(рег.БазСтоим) БазСтоим,
 sum(врег1.ВалСтоим) ВалСтоим
from
 Рег
full Join
 Врег1 on рег.товар = врег1.товар
group by
 coalesce(рег.Товар,врег1.товар)
 

  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #36 - 18. Июня 2009 :: 13:15
Печать  
alexdd писал(а) 18. Июня 2009 :: 13:12:
упс, да сорь. Рег1 там нет, не заметилУлыбка
насчет group by:
Код
Выбрать все
select
 coalesce(рег.Товар,врег1.товар) as товар,
 sum(рег.БазСтоим) БазСтоим,
 sum(врег1.ВалСтоим) ВалСтоим
from
 Рег
full Join
 Врег1 on рег.товар = врег1.товар
group by
 coalesce(рег.Товар,врег1.товар)
 



я сейчас уже так попробовал - нет, ошибку выдает.
думаю теперь это все в подзапросом что ли сделать
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #37 - 18. Июня 2009 :: 13:22
Печать  
а пройдет ли вариант
select
гот.Товар,
гот.БазСтоим,
гот.ВалСтоим
from
    (select Товар,БазСтоим from Рег fool Join Врег1 on рег.товар = врег1.товар) as Гот
group by
гот.товар

особенно волнует тот момент, что в подзапросе (select Рег.Товар,Рег.БазСтоим from Рег...) я не стал указывать ВалСтоим.
но ведь по идее в таблице Гот поле ВалСтоим будет
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #38 - 18. Июня 2009 :: 13:42
Печать  
по поводу QA - это SQL Query analyzer кака я понимаю.
Я знаю, что такая штука есть, но не умею им пользоваться.Улыбка

сейчас вот запустил его, тут по умолчанию окно текстовое открыто: скопировал туда отпарсенный текст из отладки. он у меня раскрасился разными цветами.
что теперь? как запустить?
п.с. sql server 2000, sql-администрирование не знаю, этим другие люди занимаются.
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #39 - 18. Июня 2009 :: 16:17
Печать  
С запросом разобрался.
C QA тоже.

Спасибо всем.

Вопрос.
В QA не воспринимает вещи типа #ВыбГруппа.
Хотя это уже попарсено.
Можно как-то бороться?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #40 - 18. Июня 2009 :: 17:40
Печать  
#ВыбГруппа это временная таблица. осталось еще разобраться с профайлером (Profiler) и посмотреть как эта таблица формируется. Потом тот же код(почти) можно выполнить в QA
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать