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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Возможна ли такая выборка одним запросом?
30. Ноября 2011 :: 10:39
Печать  
Существует Справочник.СерииНоменклатуры
Существует Справочник.БригадыСборщиковДопускиПоСериям с реквизитами "Серия" (см. первый справочник) и "Бригада"

На входе в процедуру есть СписокЗначений содержащий Серии.

Запросом нужно выбрать только те бригады, у которых в Справочнике.БригадыСборщиковДопускиПоСериям есть записи по ВСЕМ сериям из списка.

Такие запросы

1.
ТекстЗапроса = "
     |SELECT
     |      $СпрД.Бригада      [Бригада $Справочник.БригадыСборщиков]
     |      ,$СпрД.Серия      [Серия $Справочник.СерииНоменклатуры]
     |FROM
     |      $Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
     |WHERE
     |      СпрД.IsMark = 0
     |      AND $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
     |GROUP BY
     |      $СпрД.Бригада
     |      ,$СпрД.Серия
     |";

2.      
ТекстЗапроса = "
     |SELECT
     |      $СпрД.Бригада      [Бригада $Справочник.БригадыСборщиков]
     |      ,$СпрД.Серия      [Серия $Справочник.СерииНоменклатуры]
     |FROM
     |      $Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
     |INNER JOIN
     |      $Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия AND
     |                                                            $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
     |WHERE
     |      СпрД.IsMark = 0
     |GROUP BY
     |      $СпрД.Бригада
     |      ,$СпрД.Серия
     |";
     
     RS.УложитьСписокОбъектов(СписокСерий,"#ГруппаСерий","СерииНоменклатуры");
     RS.Подготовить(ТекстЗапроса);
     RS.ПостроитьПараметры();
     
     ТаблицаБригад = СоздатьОбъект("ТаблицаЗначений");
     ТаблицаБригад = RS.ВыполнитьИнструкцию(ТекстЗапроса,ТаблицаБригад,1);

Эти запросы выдают бригады, у которых есть допуск хотя бы к одной из серий, а нужны бригады, у которых есть допуск ко ВСЕМ сериям из списка.

Всю голову сломал...

Просьба кто знает - помогите...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #1 - 30. Ноября 2011 :: 11:01
Печать  
так во втором запросе поставь distinct ( или если он автоматически получается по условиям задачи получается то не ставь его)
и посчитай количество строк ( или sql или 1с)  и те строки
где количество меньше чем серий отбрасывай.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #2 - 30. Ноября 2011 :: 11:24
Печать  
Не совсем верно считать количество строк..Может быть несколько элементов с одинаковой серией.
И тогда вестимо болт с количеством строк в наборе
Улыбка

Хотя, вот так сделай:
Код
Выбрать все
ТекстЗапроса = "
     |SELECT
     |	$СпрД.Бригада	[Бригада $Справочник.БригадыСборщиков]
     |FROM
     |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД  (NOLOCK)
     |WHERE
     |	СпрД.IsMark = 0
     |	AND $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
     |GROUP BY
     |	$СпрД.Бригада
     |having count( $СпрД.Бригада)=(select count(*) from  #ГруппаСерий)
     |";
 


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #3 - 30. Ноября 2011 :: 11:38
Печать  
Eprst писал(а) 30. Ноября 2011 :: 11:24:
Не совсем верно считать количество строк..Может быть несколько элементов с одинаковой серией.
И тогда вестимо болт с количеством строк в наборе
Улыбка

Хотя, вот так сделай:


а distinct для чего. не будет одинак строк.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #4 - 30. Ноября 2011 :: 11:40
Печать  
Да я уже написал, примерно как слепить...
Улыбка
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #5 - 30. Ноября 2011 :: 12:32
Печать  
Запрос Eprst работает, но если в Спр.БригадыСборщиковДопускиПоСериям  2 и более одинаковых записей, то не выбирает, количество не совпадает, конечно можно проверить не на равенство, а на больше или равно - тогда работает корректно.

Спасибо всем откликнувшимся!
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #6 - 30. Ноября 2011 :: 15:28
Печать  
Не работает.

Если передан список из двух серий, если есть доступ бригады только к одной из серий и таких записей две, то всё запрос выдает эту бригаду, а не должен...
Нужно где-то выбирать различные записи доступа, а потом их сравнивать с сериями или как-то так.
Подскажите...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #7 - 30. Ноября 2011 :: 15:35
Печать  
тебе же написали.. distinict
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #8 - 30. Ноября 2011 :: 15:36
Печать  
Foma писал(а) 30. Ноября 2011 :: 15:28:
Не работает.

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

Может надо сначала сделать чтобы в #ГруппаСерий не было повторов ?
Хотя до конца не понимаю задачу может выложишь мини таблицы и что нужно получить.


  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #9 - 30. Ноября 2011 :: 15:39
Печать  
Foma писал(а) 30. Ноября 2011 :: 15:28:
Нужно где-то выбирать различные


count(distinct $СпрД.Бригада)
  

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #10 - 30. Ноября 2011 :: 16:00
Печать  
В #ГруппаСерий повторов нет, т.к. сначала серии собираются в ТаблицуЗначений, потом сворачиваются, а потом - выгружаются в СписокЗначений - "ГруппаСерий"
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #11 - 30. Ноября 2011 :: 16:07
Печать  
ТекстЗапроса = "
   |SELECT
   |      $СпрД.Бригада      [Бригада $Справочник.БригадыСборщиков]
   |FROM
   |      $Справочник.БригадыСборщиковДопускиПоСериям СпрД  (NOLOCK)
   |WHERE
   |      СпрД.IsMark = 0
   |      AND $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
   |GROUP BY
      |      $СпрД.Бригада
   |HAVING
     |      count(distinct $СпрД.Бригада) = (select count(*) from  #ГруппаСерий)
   |";
    
     RS.УложитьСписокОбъектов(СписокСерий,"#ГруппаСерий","СерииНоменклатуры");
     RS.Подготовить(ТекстЗапроса);
     RS.ПостроитьПараметры();
    
     ТаблицаБригад = СоздатьОбъект("ТаблицаЗначений");
     ТаблицаБригад = RS.ВыполнитьИнструкцию(ТекстЗапроса,ТаблицаБригад,1);

такой запрос вообще не выбирает, если переданы две разные серии, и есть допуски на эти серии у бригад...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #12 - 30. Ноября 2011 :: 16:13
Печать  
вот код. если правильно все понял должно работать
Код
Выбрать все
ТекстЗапроса = "
     |SELECT
     |	$СпрД.Бригада	[Бригада $Справочник.БригадыСборщиков]
     |FROM
     |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
     |INNER JOIN
     |	$Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия
     |INNER JOIN
     |	#ГруппаСерий on #ГруппаСерий.val = $СпрД.Серия
     |WHERE
     |	СпрД.IsMark = 0
     |GROUP BY
     |	$СпрД.Бригада
     |";
 

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #13 - 30. Ноября 2011 :: 16:22
Печать  
Не работает. Выбирает бригады, если есть хоть одно совпадение в #ГруппеСерий, а нужны бригады у которых есть доступы на ВСЕ серии из СпискаСерий...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #14 - 30. Ноября 2011 :: 16:25
Печать  
Foma писал(а) 30. Ноября 2011 :: 16:22:
Не работает. Выбирает бригады, если есть хоть одно совпадение в #ГруппеСерий, а нужны бригады у которых есть доступы на ВСЕ серии из СпискаСерий...

пиши мини тест со значениями этих таблиц и что хочешь получить.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #15 - 30. Ноября 2011 :: 16:30
Печать  
Справочник.БригадыСборщиковДопускиПоСериям
Реквизиты: Бригада,Серия
Бригада1, Серия1
Бригада1,Серия2
Бригада2,Серия1
Бригада3,Серия2

СписокСерий: Серия1,Серия2

После выборки должна быть только Бригада1, т.к. у этой бригады есть допуск и к Серии1 и к Серии2
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #16 - 30. Ноября 2011 :: 16:33
Печать  
Или так

Справочник.БригадыСборщиковДопускиПоСериям
Реквизиты: Бригада,Серия
Бригада1, Серия1
Бригада1,Серия2
Бригада2,Серия1
Бригада3,Серия2
Бригада3,Серия2

СписокСерий: Серия1,Серия2

После выборки должна быть только Бригада1, т.к. у этой бригады есть допуск и к Серии1 и к Серии2
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #17 - 30. Ноября 2011 :: 16:39
Печать  
Приведи результат запроса :

ТекстЗапроса = "
     |SELECT distinct
     |      $СпрД.Бригада      [Бригада $Справочник.БригадыСборщиков]
     |      ,$СпрД.Серия      [Серия $Справочник.СерииНоменклатуры]
     |FROM
     |      $Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
     |INNER JOIN
     |      $Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия AND
     |                                                            $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
     |WHERE
     |      СпрД.IsMark = 0
     |";
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #18 - 30. Ноября 2011 :: 16:44
Печать  
Этот запрос в первом посте.
Результат:

Бригада1, Серия1
Бригада1,Серия2
Бригада2,Серия1
Бригада3,Серия2
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #19 - 30. Ноября 2011 :: 16:50
Печать  
теперь такой запрос

ТекстЗапроса = " select Tabl_1.Бригада [Бригада $Справочник.БригадыСборщиков] , 1 as Считаем from
    | (
    |SELECT distinct
    |      $СпрД.Бригада as Бригада
    |      ,$СпрД.Серия
    |FROM
    |      $Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
    |INNER JOIN
    |      $Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия AND
    |                                                            $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
    |WHERE
    |      СпрД.IsMark = 0
    | ) as Tabl_1" ;
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #20 - 30. Ноября 2011 :: 16:51
Печать  
А так ?

Код
Выбрать все
ТекстЗапроса = "
  |SELECT
  |	$СпрД.Бригада	[Бригада $Справочник.БригадыСборщиков], $СпрД.Серия
  |FROM
  |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД  (NOLOCK)
  |WHERE
  |	СпрД.IsMark = 0
  |	AND $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
  |GROUP BY
	|	$СпрД.Бригада, $СпрД.Серия
  |HAVING
    |	count($СпрД.Бригада) = (select count(*) from  #ГруппаСерий)
  |"; 

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #21 - 30. Ноября 2011 :: 16:55
Печать  
Z1
извиняюсь, но такой запрос не работает, там слово "считаем", а как правильно вы хотели написать - я не знаю
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #22 - 30. Ноября 2011 :: 16:57
Печать  
Foma писал(а) 30. Ноября 2011 :: 16:55:
Z1
извиняюсь, но такой запрос не работает, там слово "считаем", а как правильно вы хотели написать - я не знаю


Это алияс, и.. всё работает
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #23 - 30. Ноября 2011 :: 17:00
Печать  
Foma писал(а) 30. Ноября 2011 :: 16:55:
Z1
извиняюсь, но такой запрос не работает, там слово "считаем", а как правильно вы хотели написать - я не знаю

так работает или нет ???
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #24 - 30. Ноября 2011 :: 17:05
Печать  
Сорри, работает.
Результат:

Бригада1, 1
Бригада1, 1
Бригада2, 1
Бригада3, 1
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #25 - 30. Ноября 2011 :: 17:08
Печать  
Eprst
Ваш запрос возвращает пустую выборку
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #26 - 30. Ноября 2011 :: 17:12
Печать  
а теперь такой запрос


ТекстЗапроса = " select Tabl_2.Бригада [Бригада $Справочник.БригадыСборщиков] , sum(Считаем)
   |from (
   | select Tabl_1.Бригада as Бригада  , 1 as Считаем from
   | (
   |SELECT distinct
   |      $СпрД.Бригада as Бригада
   |      ,$СпрД.Серия
   |FROM
   |      $Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
   |INNER JOIN
   |      $Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия AND
   |                                                            $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
   |WHERE
   |      СпрД.IsMark = 0
   | ) as Tabl_1
   | ) as Tabl_2
   |group by Tabl_2.Бригада" ;
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #27 - 30. Ноября 2011 :: 17:21
Печать  
Z1
Результат:
Результат:

Бригада1, 2
Бригада2, 1
Бригада3, 1
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #28 - 30. Ноября 2011 :: 17:25
Печать  
ну тогда скорее всего вот твой окончательный запрос
Код
Выбрать все
КолвоРезультатов = 2; // здесь это число сколько значений в списке #ГруппаСерий
ТекстЗапроса = " select Tabl_2.Бригада [Бригада $Справочник.БригадыСборщиков]
  | , sum(Считаем)
  |from (
  | select Tabl_1.Бригада as Бригада  , 1 as Считаем from
  | (
  |SELECT distinct
  |	$СпрД.Бригада as Бригада
  |	,$СпрД.Серия
  |FROM
  |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
  |INNER JOIN
  |	$Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия AND
  |										$СпрД.Серия IN (SELECT Val From #ГруппаСерий)
  |WHERE
  |	СпрД.IsMark = 0
  | ) as Tabl_1
  | ) as Tabl_2
  |group by Tabl_2.Бригада
  |having sum(Считаем) >= " + СокрЛП(КолвоРезультатов ) ;
 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #29 - 30. Ноября 2011 :: 17:28
Печать  
вот только inner join не нужен там вовсе.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #30 - 30. Ноября 2011 :: 17:32
Печать  
Код
Выбрать все
ТекстЗапроса = "
  |SELECT
  |	Д.Бригада	[Бригада $Справочник.БригадыСборщиков]
  |FROM
  |(Select
  |	$СпрД.Бригада Бригада,$СпрД.Серия from
  |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД  (NOLOCK)
  |WHERE
  |	СпрД.IsMark = 0
  |	AND $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
  |GROUP BY
  | 	$СпрД.Бригада, $СпрД.Серия )Д
  |Group by Д.Бригада
  |HAVING
  |	count(Д.Бригада) = (select count(*) from  #ГруппаСерий)
  |";  

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #31 - 30. Ноября 2011 :: 17:33
Печать  
Блин, работает. Тестировал по-разному.
Осталось только разобраться с запросом...
Спасибо!!!
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #32 - 30. Ноября 2011 :: 17:33
Печать  
Eprst писал(а) 30. Ноября 2011 :: 17:28:
вот только inner join не нужен там вовсе.

нужен
он пропускает помеченные на удаление серии
ну и кстати не нужно такие и заносить в #ГруппаСерий
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #33 - 30. Ноября 2011 :: 17:34
Печать  
Foma писал(а) 30. Ноября 2011 :: 17:33:
Блин, работает. Тестировал по-разному.
Осталось только разобраться с запросом...
Спасибо!!!

подожди сейчас  чуть чуть улучшу
5 сек

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #34 - 30. Ноября 2011 :: 17:35
Печать  
Z1 писал(а) 30. Ноября 2011 :: 17:33:
Eprst писал(а) 30. Ноября 2011 :: 17:28:
вот только inner join не нужен там вовсе.

нужен
он пропускает помеченные на удаление серии
ну и кстати не нужно такие и заносить в #ГруппаСерий


Ну и каков тайный смысл в их пропуске, если потом один хрен фильтр на только те, что в списке серий ?
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #35 - 30. Ноября 2011 :: 17:37
Печать  
Z1
а лучшее не враг хорошего?
Улыбка

кстати в #ГруппеСерий всегда только нужные серии
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #36 - 30. Ноября 2011 :: 17:39
Печать  
чуть лучше для sql чем (28)
Код
Выбрать все
КолвоРезультатов = 2; // здесь это число сколько значений в списке #ГруппаСерий
ТекстЗапроса = " select Tabl_2.Бригада [Бригада $Справочник.БригадыСборщиков]
  | , sum(Считаем)
  |from (
  | select Tabl_1.Бригада as Бригада  , 1 as Считаем from
  | (
  |SELECT distinct
  |	$СпрД.Бригада as Бригада
  |	,$СпрД.Серия
  |FROM
  |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
  |INNER JOIN
  |	$Справочник.СерииНоменклатуры СпрС With (NOLOCK) ON СпрС.ID = $СпрД.Серия
  |
  |WHERE
  |	СпрД.IsMark = 0
  |     and $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
  | ) as Tabl_1
  | ) as Tabl_2
  |group by Tabl_2.Бригада
  |having sum(Считаем) >= " + СокрЛП(КолвоРезультатов ) ;
 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #37 - 30. Ноября 2011 :: 17:41
Печать  
Foma писал(а) 30. Ноября 2011 :: 17:37:
Z1
а лучшее не враг хорошего?
Улыбка

кстати в #ГруппеСерий всегда только нужные серии

так можно было остановиться на первом моем ответе из поста # 1
и делать свертку в 1с.


PS и в списке #ГруппеСерий не должно быть серий помеченных на удаление иначе запрос не будет работать
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #38 - 30. Ноября 2011 :: 17:43
Печать  
Согласен, что лучше получить результат SQL запросом, чем потом еще обрабатывать 1С-ми методами.
Почему условие в WHERE лучше, чем в JOIN?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #39 - 30. Ноября 2011 :: 17:44
Печать  
И один хрен - иннер джоин там явно лишний.
Тем более, удаляешь ты помеченные на удаление из основного справочника, а не у присоединенных серий.
Которые и присоединять не надо.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #40 - 30. Ноября 2011 :: 17:45
Печать  
Foma писал(а) 30. Ноября 2011 :: 17:43:
Почему условие в WHERE лучше, чем в JOIN?


Потому, что join- это декартово произведение обоих таблиц + фильрация результата + добавление строк (если это внешнее соединение)..
а where - это всего лишь фильтрация выборки.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #41 - 30. Ноября 2011 :: 17:47
Печать  
Foma писал(а) 30. Ноября 2011 :: 17:43:
Почему условие в WHERE лучше, чем в JOIN?

Ответ именно для этого случая
по тому что  ON идет по индексу
а условие in  в on  в индекс не попадает поэтому
слишком много закладок

т.е. в on надо оставлять то что попадает в индекс.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #42 - 30. Ноября 2011 :: 17:48
Печать  
Т.е. фильтр по ID попадает в индекс, а по реквизиту "серия" - нет, поэтому лучше в WHERE?


Спасибо большое, всё работает.
Буду разбираться с запросом...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #43 - 30. Ноября 2011 :: 17:50
Печать  
Как в #30 проверил ?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #44 - 30. Ноября 2011 :: 17:54
Печать  
Eprst писал(а) 30. Ноября 2011 :: 17:44:
И один хрен - иннер джоин там явно лишний.
Тем более, удаляешь ты помеченные на удаление из основного справочника, а не у присоединенных серий.
Которые и присоединять не надо.

согласен
я думал что не вносяться именно серии
окончательный запрос - завтра.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #45 - 30. Ноября 2011 :: 17:57
Печать  
Проверил #30, блин, тоже работает.
Спасибо!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #46 - 30. Ноября 2011 :: 18:00
Печать  
Ага, теперь проверь, какой вариант быстрее
Подмигивание
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Возможна ли такая выборка одним запросом?
Ответ #47 - 30. Ноября 2011 :: 18:02
Печать  
Я оставил оба варианта, как только будет объем информации - обязательно проверю, хотя очень большого объема тут не будет никогда...
На самом деле спасибо вам обоим.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #48 - 01. Декабря 2011 :: 07:43
Печать  
улучшенный 36 без лишнего iiner

Код
Выбрать все
КолвоРезультатов = 2; // здесь это число сколько значений в списке #ГруппаСерий
ТекстЗапроса = " select Tabl_2.Бригада [Бригада $Справочник.БригадыСборщиков]
  | , sum(Считаем)
  |from (
  | select Tabl_1.Бригада as Бригада  , 1 as Считаем from
  | (
  |SELECT distinct
  |	$СпрД.Бригада as Бригада
  |	,$СпрД.Серия
  |FROM
  |	$Справочник.БригадыСборщиковДопускиПоСериям СпрД With (NOLOCK)
  |
  |WHERE
  |	СпрД.IsMark = 0
  |     and $СпрД.Серия IN (SELECT Val From #ГруппаСерий)
  | ) as Tabl_1
  | ) as Tabl_2
  |group by Tabl_2.Бригада
  |having sum(Считаем) >= " + СокрЛП(КолвоРезультатов ) ;
 



PS кстати оптимизатор запросов ms sql с вероятностью 99%
сам преобразует 36 в 48 (выкинет лишний inner),
точнее в результате компиляции и 36 и 48 получится один и тот же план выполнения.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #49 - 02. Декабря 2011 :: 12:02
Печать  
А ещё иногда полезно думать тупо. Я бы к примеру так написал:
Код
Выбрать все
	тзп_ПлохиеБригады = "
	|SELECT
	|	$СпрД.Бригада Бригада
	|FROM
	|	$Справочник.БригадыСборщиковДопускиПоСериям СпрД (NOLOCK)
	|WHERE
	|	$СпрД.Серия Not IN (SELECT Val From #ГруппаСерий)
	|";

	ТекстЗапроса = "
	|SELECT
	|	Бригады.ID [Бригада $Справочник.БригадыСборщиков]
	|FROM
	|	$Справочник.БригадыСборщиков Бригады (NOLOCK)
	|WHERE
	|	Бригады.IsMark = 0
	|	AND Бригады.ID Not In ("+тзп_ПлохиеБригады+")
	|";
 



и ещё вопрос, что эффективнее Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #50 - 02. Декабря 2011 :: 12:12
Печать  
ADirks писал(а) 02. Декабря 2011 :: 12:02:
А ещё иногда полезно думать тупо. Я бы к примеру так написал:

и ещё вопрос, что эффективнее Улыбка


Ага полезно, как у тебя - туфта Улыбка)
Нужно не вхождение в список серий, а чтоб все серии из списка были.

Точнее, у тебя вообще бред.. в особенности даже то, что в выборку могут попасть бригады, которых вообще нет в справочнике БригадыСборщиковДопускиПоСериям
Улыбка

И это помимо "неверных" серий.

  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #51 - 02. Декабря 2011 :: 12:16
Печать  
может я конечно и туплю под вечер, но мне всё же кажется, что
Not In
не то же самое, что
In

И потом, я специально запрос на 2 логических части разбил. Это тоже полезная технология.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #52 - 02. Декабря 2011 :: 12:18
Печать  
Я вижу, что нот ин, поэтому и написал Улыбка
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #53 - 02. Декабря 2011 :: 12:19
Печать  
Цитата:
...  в выборку могут попасть бригады, которых вообще нет в справочнике БригадыСборщиковДопускиПоСериям

Это да, согласен.  Я в общем просто принцип хотел продемонстрировать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #54 - 02. Декабря 2011 :: 12:22
Печать  
Пример:
Справочник.БригадыСборщиковДопускиПоСериям
Реквизиты: Бригада,Серия
Бригада1, Серия1
Бригада1,Серия2
Бригада2,Серия1
Бригада3,Серия2
Бригада3,Серия2

СписокСерий: Серия1,Серия2

твой первый запрос вернёт пусто..
второй запрос вернёт все бригады, а нужно только Бригада1, ибо только у неё 2 серии из списка серий..

ЗЫ: автору надо было не вхождение в список, а чтоб все элементы из списка были, вот.

  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #55 - 05. Декабря 2011 :: 05:41
Печать  
да, тупанул... ну что-ж, как спел классик: "если уж начал (ту)пить, то надо до(ту)пить до конца"
Код
Выбрать все
	тзп_ПлохиеБригады = "
	|SELECT
	|	Бригады.ID Бригада
	|FROM
	|	$Справочник.БригадыСборщиков Бригады (NOLOCK)
	|	CROSS JOIN #ГруппаСерий Серии (NoLock)
	|
	|	LEFT JOIN $Справочник.БригадыСборщиковДопускиПоСериям Допуски (NoLock) ON
	|		$Допуски.Бригада = Бригады.ID
	|		AND $Допуски.Серия = Допуски.Val
	|WHERE
	|	$Допуски.Серия Is Null
	|";

	ТекстЗапроса = "
	|SELECT
	|	Бригады.ID [Бригада $Справочник.БригадыСборщиков]
	|FROM
	|	$Справочник.БригадыСборщиков Бригады (NOLOCK)
	|WHERE
	|	Бригады.IsMark = 0
	|	AND Бригады.ID Not In ("+тзп_ПлохиеБригады+")
	|";
 



Смысл всего этого - уйти от косвенной методики определения попадания в условия задачи.
И было бы любопытно сравнить планы запросов, которые сервер построит.  Есть подозрение, что во всех вариантах больше всего времени сожрёт проверка IsMark  Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможна ли такая выборка одним запросом?
Ответ #56 - 05. Декабря 2011 :: 05:52
Печать  
AND $Допуски.Серия = Допуски.Val

тут поди Серии.val ?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Возможна ли такая выборка одним запросом?
Ответ #57 - 05. Декабря 2011 :: 07:43
Печать  
Eprst писал(а) 05. Декабря 2011 :: 05:52:
AND $Допуски.Серия = Допуски.Val

тут поди Серии.val ?

да, конечно
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать