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