Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Сложное условие в запросе (число прочтений - 3503 )
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Сложное условие в запросе
29. Июня 2011 :: 08:00
Печать  
Уважаемые специалисты, подскажите пожалуйста, есть ли возможность сделать следующее:
база DBF, в ней 2 справочника, Действия и ИсторияДействий  (подчинен справочнику Действия). В обоих есть поле вида Справочник.Пользователи. Если у элемента спр. Действия нет подчиненных элементов спр. ИсторияДействий, то в колонке АвторИст выводится пустое значение. Скажите пожалуйста - как написать условие отбора по АвторИст, такого примерно вида
( АвторИст = АвторИстОтбор ) OR ( IsEmpty( АвторИст ) )?

Вот текст запроса:

     ТекстЗапроса = "
     |SELECT
     |       Спр.ID         as [Элем       $Справочник.Действия],
     |      $Спр.Автор      as [Автор      $Справочник.Пользователи],
     |       СпрИст.ID      as [ЭлемИст    $Справочник.ИсторияДействий],
     |      $СпрИст.Автор   as [АвторИст   $Справочник.Пользователи],
     |FROM
     |   $Справочник.Действия as Спр
     |LEFT JOIN
     |      $Справочник.ИсторияДействий СпрИст ON СпрИст.ParentExt = Спр.ID
     |";
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Сложное условие в запросе
Ответ #1 - 29. Июня 2011 :: 08:50
Печать  
Вдогонку - поправлюсь - проблема не с отбором по пустому значению, а с отбором по неудаленному у подчиненного, когда его нет.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Сложное условие в запросе
Ответ #2 - 29. Июня 2011 :: 08:58
Печать  
бррр
нужно найти все элементы в подчиненном справочнике, для которых некорректна ссылка на владельца (т.е. элемент-владелец не существует)?

В скуле это выглядело бы так:

FROM
    $Справочник.ИсторияДействий СпрИст
    LEFT JOIN $Справочник.Действия as Спр ON СпрИст.ParentExt = Спр.ID
Where
Спр.ID Is Null
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сложное условие в запросе
Ответ #3 - 29. Июня 2011 :: 09:09
Печать  
(0)
coalesce($СпрИст.Автор,$Спр.Автор) as [АвторИст   $Справочник.Пользователи],

ЗЫ: вот только я не помню, vfp поддерживает coalesce или нет, если нет - сделать через iif или icase
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Сложное условие в запросе
Ответ #4 - 29. Июня 2011 :: 09:12
Печать  
Спасибо за ответ, но немножко не так -

Сейчас выводится таблица вот такого вида:

ЭлемВладелец ПолеАвторЭлемВладельца ЭлемПодчСпр  ПолеАвторЭлемПодчСпр

при этом у справочника-владельца подчиненные элементы 1) могут быть, 2) могут и не быть. Т.е. результат вывода такой:

1)
0001 Иванов    00001 Иванов
0001 Иванов    00001 Сидоров

2)
0003 Иванов     -----   -----------

где ---  - пустое значение

но в целом я нашел в доке как этой фильтровать, но столкнулся с тем, что есть еще фильтр по удаленности и он фильтрует пустые элементы подчиненного элемента как удаленные. Придется фильтровать вручную, если это не обойти.



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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сложное условие в запросе
Ответ #5 - 29. Июня 2011 :: 09:14
Печать  
Не понял, что ты хочешь видеть в итоге и что фильтровать (особенно при левом соединении).
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Сложное условие в запросе
Ответ #6 - 29. Июня 2011 :: 09:21
Печать  
Что я хочу - получить прямым запросом информацию по справочнику и его подчиненному с готовыми фильтрами - непомеченные на удаление элементы и отбор по автору. Как в текущем запросе фильтровать непомеченные на удаление (как владельцы, так и подчиненные)?
Если делать так:
WHERE ( Спр.IsMark = '' ) AND ( СпрИст.IsMark = '' )

то в таблице

0001 Иванов    00001 Иванов
0001 Иванов    00001 Сидоров
0003 Иванов     -----   -----------

третья строка тоже пропадает, хотя в ней оба элемента не помечены на удаление, а всего лишь отсутствует подчиненный элемент.

Также если наложить фильтр
AND ( $СпрИст.Автор IN (SELECT Val FROM " + ТаблОтбАвторПосл + ") ) OR ($СпрИст.Автор = $ПустойИД)"

то третья строка также пропадает.

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сложное условие в запросе
Ответ #7 - 29. Июня 2011 :: 09:51
Печать  
делая в ветке where условия на присоединяемую табличку, ты автоматически левое соединение превращаешь во внутреннее (inner join)

Накладывай своё условие в месте присоединения табличек  и будет тебе счастье.
  
Наверх
 
IP записан
 
ildary
Full Member
***
Отсутствует



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Сложное условие в запросе
Ответ #8 - 29. Июня 2011 :: 10:10
Печать  
Уважаемый Eprst, я Вас правильно понял, что надо заменить текущий Left Join на

|LEFT JOIN (
|      SELECT
|            СпрИст.ID
|      FROM $Справочник. плнИсторияДействий as СпрИст
|      WHERE
|            СпрИст.IsMark = ''
|      ) as СпрИст ON СпрИст.ParentExt = Спр.ID
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Сложное условие в запросе
Ответ #9 - 29. Июня 2011 :: 10:39
Печать  
нет, не правильно..
тебе всего лишь нужно было сделать так (чтоб строки не "пропадали"):

Код
Выбрать все
....
|LEFT JOIN
|	$Справочник.ИсторияДействий СпрИст ON СпрИст.ParentExt = Спр.ID and СпрИст.IsMark = ''
|Where  Спр.IsMark = ''  






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



Сообщений: 163
Зарегистрирован: 24. Марта 2008
Re: Сложное условие в запросе
Ответ #10 - 29. Июня 2011 :: 11:13
Печать  
Большое спасибо! Оказывается это проще, чем представлялось...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать