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



Сообщений: 24
Зарегистрирован: 10. Октября 2008
Пол: Мужской
Как задать условие на подзапрос
23. Апреля 2010 :: 10:28
Печать  
Добрый день. База dbf, соответственно vfpro oledb.

Вот такой запрос обрабатывается без ошибки
Код
Выбрать все
  |SELECT
	|	спрДатыСдачи.id as [элДатаСдачи $Справочник.ДатаСдачиВМагазин]
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as спрДатыСдачи
	|INNER JOIN
	|(
	|SELECT TOP 1
	|	прДатыСдачи.id as ИД
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as прДатыСдачи
	|ORDER BY прДатыСдачи.id
	|)
	|as ТаблицаПервых
	|ON (ТаблицаПервых.ИД <>  спрДатыСдачи.id)
	|WHERE
	|	(UPPER($спрДатыСдачи.ПланМагазин) BETWEEN UPPER('"+ИДПлана+"         ') AND UPPER('"+ИДПлана+"ZZZZZZZZZ'))
 



Если добавить условие на подзапрос выскакивает ошибка FAILED! ICommandText::Execute(): SQL: Column '     ' is not found.

Вот вариант с условием
Код
Выбрать все
	|SELECT
	|	спрДатыСдачи.id as [элДатаСдачи $Справочник.ДатаСдачиВМагазин]
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as спрДатыСдачи
	|INNER JOIN
	|(
	|SELECT TOP 1
	|	прДатыСдачи.id as ИД
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as прДатыСдачи
	|WHERE
	|	($прДатыСдачи.ПланМагазин = $спрДатыСдачи.ПланМагазин)
	|ORDER BY прДатыСдачи.id
	|)
	|as ТаблицаПервых
	|ON (ТаблицаПервых.ИД <>  спрДатыСдачи.id)
	|WHERE
	|	(UPPER($спрДатыСдачи.ПланМагазин) BETWEEN UPPER('"+ИДПлана+"         ') AND UPPER('"+ИДПлана+"ZZZZZZZZZ'))
 



Как тогда задать условие на подзапрос?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как задать условие на подзапрос
Ответ #1 - 23. Апреля 2010 :: 10:38
Печать  
Вообще, твой внутренний селект ничего не знает о внешнем..
делай условие в присоединении..
  
Наверх
 
IP записан
 
Betas
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 10. Октября 2008
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #2 - 23. Апреля 2010 :: 10:47
Печать  
а как? Подзапрос выдает одну строку (SELECT TOP 1), соответственно делать условие уже не на что.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как задать условие на подзапрос
Ответ #3 - 23. Апреля 2010 :: 11:07
Печать  
Странный подзапрос, особенно сортировка по id и выдача первого..
Нужны все элементы кроме первого? ... или что ?
  
Наверх
 
IP записан
 
Betas
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 10. Октября 2008
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #4 - 23. Апреля 2010 :: 11:11
Печать  
Совершенно верно, нужны все элементы справочника совпадающие по полю ПланМагазин (дублирующие записи) кроме первых по вводу.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как задать условие на подзапрос
Ответ #5 - 23. Апреля 2010 :: 11:20
Печать  
Код
Выбрать все
INNER JOIN
	|(
	|SELECT
	|	MIN(прДатыСдачи.id) as ИД
	|	,$прДатыСдачи.ПланМагазин as План
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as прДатыСдачи
	|Group by $прДатыСдачи.ПланМагазин
	|) as ТаблицаПервых
	|ON ТаблицаПервых.ИД <>  спрДатыСдачи.id
	|AND $спрДатыСдачи.ПланМагазин  = ТаблицаПервых.План 



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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #6 - 23. Апреля 2010 :: 11:25
Печать  
Код
Выбрать все
|SELECT
|	спрДатыСдачи.id as [элДатаСдачи $Справочник.ДатаСдачиВМагазин]
|FROM
|	$Справочник.ДатаСдачиВМагазин as спрДатыСдачи
|WHERE
|	(UPPER($спрДатыСдачи.ПланМагазин) BETWEEN UPPER('"+ИДПлана+"	   ') AND UPPER('"+ИДПлана+"ZZZZZZZZZ'))
| AND спрДатыСдачи.id <> (
|SELECT
|	min(s1.id)
|FROM
|	$Справочник.ДатаСдачиВМагазин as s1
|WHERE
|	(UPPER($s1.ПланМагазин) BETWEEN UPPER('"+ИДПлана+"	   ') AND UPPER('"+ИДПлана+"ZZZZZZZZZ'))
|
|)
 

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



Сообщений: 24
Зарегистрирован: 10. Октября 2008
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #7 - 23. Апреля 2010 :: 11:31
Печать  
Большое спасибо, все работает и результат верный.
Немного смущает вопрос быстродействия.
Подзапрос будет группировать всю таблицу справочника и только затем применять условие или fox как то это оптимизирует?
  
Наверх
 
IP записан
 
Betas
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 10. Октября 2008
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #8 - 23. Апреля 2010 :: 11:47
Печать  
Второй вариант (условие узкое и в индексе, выполняться должен быстрее) но выдает ошибку
Код
Выбрать все
SELECT
	спрДатыСдачи.id as [элДатаСдачи_1c_type_Справочник_1c_dot_ДатаСдачиВМагазин]
FROM
	sc8048 as спрДатыСдачи
WHERE
	(UPPER(спрДатыСдачи.sp8051) BETWEEN UPPER('  32X6SPB	   ') AND UPPER('  32X6SPBZZZZZZZZZ'))
 AND спрДатыСдачи.id <> (
SELECT
	min(спрДатыСдачи.id)
FROM
	sc8048 as s1
WHERE
	(UPPER(s1.sp8051) BETWEEN UPPER('  32X6SPB	   ') AND UPPER('  32X6SPBZZZZZZZZZ'))

)
ТЗ = _Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{Глобальный модуль(15687)}: FAILED! ICommandText::Execute(): SQL: Column '     ' is not found. 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #9 - 23. Апреля 2010 :: 11:52
Печать  
Возьми из 6 еще раз.
Ты  взял вариант,
а я его после этого отредактировал.
правильно   min(s1.id)
  
Наверх
 
IP записан
 
Betas
Junior Member
**
Отсутствует



Сообщений: 24
Зарегистрирован: 10. Октября 2008
Пол: Мужской
Re: Как задать условие на подзапрос
Ответ #10 - 23. Апреля 2010 :: 12:02
Печать  
Да, я тупо скопировал вариант до исправления...
После замены ошибки нет, но результат не верный, тк исключается из выборки только первый элемент, что естественно ведь условие ограничивает не по ПланМагазин. а только по План.

Так работает
Код
Выбрать все
	|SELECT
	|	спрДатыСдачи.id as [элДатаСдачи $Справочник.ДатаСдачиВМагазин]
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as спрДатыСдачи
	|WHERE
	|	(UPPER($спрДатыСдачи.ПланМагазин) BETWEEN UPPER('"+ИДПлана+"	   ') AND UPPER('"+ИДПлана+"ZZZZZZZZZ'))
	| AND спрДатыСдачи.id <> (
	|SELECT
	|	min(s1.id)
	|FROM
	|	$Справочник.ДатаСдачиВМагазин as s1
	|WHERE
	|	($s1.ПланМагазин = $спрДатыСдачи.ПланМагазин)
	//|	(UPPER($s1.ПланМагазин) BETWEEN UPPER('"+ИДПлана+"	   ') AND UPPER('"+ИДПлана+"ZZZZZZZZZ'))

 


Т.е. в подзапросе условия можно обращаться к строке основного запроса, а в присоединении нельзя.
Большое спасибо. наконец-то разобрался.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать