Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) Возможна ли такая выборка одним запросом? (число прочтений - 7332 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать