Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) помогите с запросом, долго выполняется ( (число прочтений - 2356 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
помогите с запросом, долго выполняется (
17. Июня 2011 :: 08:15
Печать  
Код
Выбрать все
select distinct
вв0.id id
from
(select              
(select top 1
$ДокДоговор.Контрагент Контрагент
from $Справочник.Контрагенты СпрКонтрагентыВнутр (nolock)
left join $Документ.Договор ДокДоговор (nolock) on $ДокДоговор.Контрагент=СпрКонтрагентыВнутр.id
where $СпрКонтрагентыВнутр.ИНН=$СпрКонтрагенты1.ИНН
order by $ДокДоговор.НачДата desc) id
from $Справочник.Контрагенты СпрКонтрагенты1 (nolock)) вв0
where not вв0.id is null

 

  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: помогите с запросом, долго выполняется (
Ответ #1 - 17. Июня 2011 :: 10:54
Печать  
че-то на бредятину смахивает
ЗЫ: чего хотел получить этим кодом ?
Клиентосов, у которых есть последний документ-договор ?

Не проще ли просто взять клиентосов из шапки документа и привет, чем нелепые левые соедиения (которые еще и в иннер превращаются из-за условия по инн).. да еще и вложенный запрос там нафик не упёрся).

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: помогите с запросом, долго выполняется (
Ответ #2 - 17. Июня 2011 :: 11:06
Печать  
да задача простая - перенести из одной базы в другую клиентов.
но в этой первой они размножились, и нужно перенести по каждому ИНН одного. вместе с его реквизитами, которым могут у разных элементов с одним ИНН отличатся.
и этот элемент определяется как тот, с которым был выписан последний договор. да в принципе удалось переписать немного в другом виде

Код
Выбрать все
	select distinct
	вв0.id id
	from
	(select              
	(select top 1
	$ДокДоговор0.Контрагент Контрагент
	from $Документ.Договор ДокДоговор0 (nolock)
	inner join $Справочник.Контрагенты СпрКонтрагенты0 (nolock) on СпрКонтрагенты0.id=$ДокДоговор0.Контрагент
	where $СпрКонтрагенты0.ИНН=$СпрКонтрагенты1.ИНН
	order by $ДокДоговор0.НачДата desc) id

	from $Документ.Договор ДокДоговор1 (nolock)
	inner join $Справочник.Контрагенты СпрКонтрагенты1 (nolock) on СпрКонтрагенты1.id=$ДокДоговор1.Контрагент
	) вв0
	where not вв0.id is null

 



этот значительно шустрее
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: помогите с запросом, долго выполняется (
Ответ #3 - 17. Июня 2011 :: 11:18
Печать  
Ничего не понял..
Чем вот это не устраивает ?
Код
Выбрать все
select distinct
	$Док.Контрагент Контрагент
from  $Документ.Договор Док (nolock) 



Или нужно, чтоб еще и с одинаковыми ИНН потом не было ?
И какого брать тогда клиентоса ? Если их, 20 к примеру, с одинаковым ИНН и у всех есть документы-договоры.
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: помогите с запросом, долго выполняется (
Ответ #4 - 17. Июня 2011 :: 11:30
Печать  
так есть же условие - у которого более поздняя дата нач.действия договора. Стало быть у него наиболее свежие реквизиты
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: помогите с запросом, долго выполняется (
Ответ #5 - 17. Июня 2011 :: 11:49
Печать  
хотя,лучше так , дополнить..

Код
Выбрать все
select distinct
   $Док.Контрагент [Клиентос $Справочник.Контрагенты]
   from  $Документ.Договор Док (nolock)
   inner join (
	   select
		 $Спр.ИНН ИНН
		 ,max($Док.НачДата) НачДата
	   from  $Документ.Договор Док (nolock)
	   Left join $Справочник.Контрагенты Спр on Спр.id = $Док.Контрагент
	   group by $Спр.ИНН
	   ) tab  on tab.НачДата= $Док.НачДата
	inner join  $Справочник.Контрагенты Спр on Спр.id = $Док.Контрагент and  tab.ИНН = $Спр.ИНН

 

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: помогите с запросом, долго выполняется (
Ответ #6 - 17. Июня 2011 :: 12:48
Печать  
неа - где то ошибка. так выдает немного больше контрагентов, а именно вместо 331 выдал 338

откуда взялось 331:

Код
Выбрать все
select
   $Док.Контрагент [Контрагент $Справочник.Контрагенты]
   ,$СпрКонтрагенты.ИНН ИНН
   from  $Документ.Договор Док (nolock)  
inner join $Справочник.Контрагенты СпрКонтрагенты (nolock) on СпрКонтрагенты.id=$Док.Контрагент

 



а потом свернуть таблицу по ИНН
как раз 331

задача как раз в запросе получить, чтобы в таблице не было одинаковых ИНН
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: помогите с запросом, долго выполняется (
Ответ #7 - 17. Июня 2011 :: 13:02
Печать  
Значит, у тебя есть клиентосы с одинаковым ИНН с одинаковой датой договора.
Какой из них брать ?

Тогда max($Док.Контрагент) + group by $Спр.ИНН в верхний запрос
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: помогите с запросом, долго выполняется (
Ответ #8 - 17. Июня 2011 :: 13:18
Печать  
брать контрагента с каждым ИНН один раз.
по макс дате договора.
если две максимальные - тогда любого.
типа того

да скорость уже вполне устраивает, а другой вариант решения таких задач сохраню
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: помогите с запросом, долго выполняется (
Ответ #9 - 17. Июня 2011 :: 13:45
Печать  
Код
Выбрать все
select
   max($Док.Контрагент) [Клиентос $Справочник.Контрагенты]
 , tab.ИНН
   from  $Документ.Договор Док (nolock)
   inner join (
	   select
		 $Спр.ИНН ИНН
		 ,max($Док.НачДата) НачДата
	   from  $Документ.Договор Док (nolock)
	   Left join $Справочник.Контрагенты Спр (nolock) on Спр.id = $Док.Контрагент
	   group by $Спр.ИНН
	   ) tab  on tab.НачДата= $Док.НачДата
	inner join  $Справочник.Контрагенты Спр (nolock) on Спр.id = $Док.Контрагент and  tab.ИНН = $Спр.ИНН
group by  tab.ИНН 

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


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: помогите с запросом, долго выполняется (
Ответ #10 - 18. Июня 2011 :: 05:30
Печать  
можешь сказать общими словами, есть преимущество такого запроса перед моим?
я по большому счету ламер в них, использую преимущественно простые, дальнейшую обработку по фильтрации и группировке переношу на ИТ, с ними как то сподручней. Хотя, бываю случаи, когда нужно сделать запрос, выдающий точный набор данных
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать