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


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
вложенный запрос
16. Июня 2009 :: 09:06
Печать  
Имею две таблицы:

------------
Элемент1
------------
Элемент2
------------

И подчиненная:

----------------------------------
Владелец | Имя  | Значение     |
----------------------------------
Элемент1 | Имя1 | Элемент2     |
----------------------------------
Элемент1 | Имя1 | 2           |
----------------------------------
Элемент2 | Имя1 | 1            |
----------------------------------
Элемент2 | Имя2 | 2            |
----------------------------------
Элемент3 | Имя2 | 2            |
----------------------------------

Имея исходное значение = элемент1 хочу получить в выборку
все элементы, находящиеся в зоне видимости Элемента1 с полем значение равным двум (Значение = 2)
,т.е. в данном случае результат выборки Элемент1 и элемент2.

наверняка требуется вложенный запрос но опыта в написании на скл маловато поэтому придумать не могу. Нуждаюсь в помощи. Заранее благодарен.
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #1 - 16. Июня 2009 :: 09:13
Печать  
     ТекстЗапроса = "
     |SELECT
     |      Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов],
     |      Спр.PARENTEXT as [Владелец $Справочник.Номенклатура],
     |      $Спр.Элемент as [Элемент $Справочник],
     |      спрПрод.ID  as ЭлементИД
     |FROM
     |      $Справочник.НормыРасходов as Спр
     |LEFT  JOIN
     |      $Справочник.ТехОперации as спрТО ON ($ВидСправочника36.ТехОперации+спрТО.ID = $Спр.Элемент)
     |LEFT JOIN
     |      $Справочник.Номенклатура as спрПрод ON ($ВидСправочника36.Номенклатура + спрПрод.ID = $Спр.Элемент)
     |WHERE
     |      Спр.IsFolder = 2 AND
     |      Спр.IsMark = ''
     |AND      
     |      Спр.PARENTEXT = :УсловиеПродукция
     |      OR Спр.PARENTEXT IN (спрПрод.ID)
     |      AND спрТО.ID = :ВыбПечать
     |";


     
     Запрос. УстановитьТекстовыйПараметр ("УсловиеТО", ВыбПечать);
     Запрос. УстановитьТекстовыйПараметр ("ВыбНорма", ВыбНорма);
     Запрос. УстановитьТекстовыйПараметр ("УсловиеПродукция", ВыбПродукция);

пробовал так выборка пуста
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: вложенный запрос
Ответ #2 - 16. Июня 2009 :: 09:41
Печать  
Справочник.НормыРасходов подчинен Справочник.Номенклатура.
Что дальше? Какое значение в каком справочнике = 2?
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #3 - 16. Июня 2009 :: 09:44
Печать  
Злой Бобр писал(а) 16. Июня 2009 :: 09:41:
Справочник.НормыРасходов подчинен Справочник.Номенклатура.
Что дальше? Какое значение в каком справочнике = 2?


здесь проверка
|      AND спрТО.ID = :ВыбПечать
то есть проверка на наличие технологической операции в нормах расходов, а технологические операции лежат в третей таблице((
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: вложенный запрос
Ответ #4 - 16. Июня 2009 :: 09:44
Печать  
Код
Выбрать все
|	$Справочник.ТехОперации as спрТО ON спрТО.ID = Right($Спр.Элемент,9) AND спрТО.ID = :ВыбПечать
|LEFT JOIN
|	$Справочник.Номенклатура as спрПрод ON спрПрод.ID = Right($Спр.Элемент,9)

 

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


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #5 - 16. Июня 2009 :: 09:47
Печать  
объясню на русском:
продукция состоит из узлов и/или технологических операций нужно определить есть ли в составе нормативов заданной продукции или ее узлов данная технологическая операция.
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #6 - 16. Июня 2009 :: 09:48
Печать  
leov-001 писал(а) 16. Июня 2009 :: 09:44:
Код
Выбрать все
|	$Справочник.ТехОперации as спрТО ON спрТО.ID = Right($Спр.Элемент,9)
|LEFT JOIN
|	$Справочник.Номенклатура as спрПрод ON спрПрод.ID = Right($Спр.Элемент,9)

 


не думаю, что это принципиально.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: вложенный запрос
Ответ #7 - 16. Июня 2009 :: 09:51
Печать  
OnCheck писал(а) 16. Июня 2009 :: 09:48:
leov-001 писал(а) 16. Июня 2009 :: 09:44:
Код
Выбрать все
|	$Справочник.ТехОперации as спрТО ON спрТО.ID = Right($Спр.Элемент,9)
|LEFT JOIN
|	$Справочник.Номенклатура as спрПрод ON спрПрод.ID = Right($Спр.Элемент,9)

 


не думаю, что это принципиально.


Код
Выбрать все
$Справочник.ТехОперации as спрТО ON спрТО.ID = Right($Спр.Элемент,9) AND спрТО.ID = :ВыбПечать 


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


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #8 - 16. Июня 2009 :: 09:53
Печать  
без узлов все просто:
ТекстЗапроса = "
|SELECT
|      Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов],
|      Спр.PARENTEXT as [Владелец $Справочник.Номенклатура],
|       $Спр.Элемент as [Элемент $Справочник]
|FROM
|      $Справочник.НормыРасходов as Спр
|WHERE
|      Спр.IsFolder = 2 AND
|      Спр.IsMark = ''
|      AND $Спр.Элемент = :УсловиеТО~
|      AND Спр.PARENTEXT = :УсловиеПродукция
|";
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #9 - 16. Июня 2009 :: 09:58
Печать  
Код
Выбрать все
$Справочник.ТехОперации as спрТО ON спрТО.ID = Right($Спр.Элемент,9) AND спрТО.ID = :ВыбПечать 


[/quote]
можно и так, но не фильтруются элементы справочника нормы расходов подчиненные продукции, которая является узлами для выбранного комплекта
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #10 - 16. Июня 2009 :: 10:01
Печать  
OnCheck писал(а) 16. Июня 2009 :: 09:53:
без узлов все просто:
ТекстЗапроса = "
|SELECT
|      Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов],
|      Спр.PARENTEXT as [Владелец $Справочник.Номенклатура],
|       $Спр.Элемент as [Элемент $Справочник]
|FROM
|      $Справочник.НормыРасходов as Спр
|WHERE
|      Спр.IsFolder = 2 AND
|      Спр.IsMark = ''
|      AND $Спр.Элемент = :УсловиеТО~
|      AND Спр.PARENTEXT = :УсловиеПродукция
|";


вот если бы упаковать ID выбранной продукции и принадлежащих ей узлов в список, а потом прогнать по этому списку этот запрос тогда наверное получилось бы но как это сделать?
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: вложенный запрос
Ответ #11 - 16. Июня 2009 :: 10:04
Печать  
Код
Выбрать все
ТекстЗапроса = "
|SELECT
|  Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов]
|, Спр.PARENTEXT as [Владелец $Справочник.Номенклатура]
|, $Спр.Элемент as [Элемент $Справочник]
|, спрПрод.ID  as ЭлементИД
|FROM
|  $Справочник.НормыРасходов as Спр
|  LEFT JOIN $Справочник.ТехОперации as спрТО ON $ВидСправочника36.ТехОперации+спрТО.ID = $Спр.Элемент AND спрТО.ID = :ВыбПечать
|  LEFT JOIN $Справочник.Номенклатура as спрПрод ON $ВидСправочника36.Номенклатура + спрПрод.ID = $Спр.Элемент
|WHERE
|  Спр.IsFolder = 2 AND
|  Спр.IsMark = ''  AND
|  Спр.PARENTEXT = :УсловиеПродукция OR
|  Спр.PARENTEXT IN (SELECT ID From $Справочник.Номенклатура)
|";
 

  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: вложенный запрос
Ответ #12 - 16. Июня 2009 :: 10:08
Печать  
Я чего-то туплю.
Есть 3 справочника: Номенклатура, НормыРасходов (подчинен Номенклатура), ТехОперации (кому подчинен ?).
В итоге я так понимаю нужно отобрать список Номенклатуры при условии что - ??? (вот тут подробнее)
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: вложенный запрос
Ответ #13 - 16. Июня 2009 :: 10:10
Печать  
Злой Бобр писал(а) 16. Июня 2009 :: 10:08:
Я чего-то туплю.
Есть 3 справочника: Номенклатура, НормыРасходов (подчинен Номенклатура), ТехОперации (кому подчинен ?).
В итоге я так понимаю нужно отобрать список Номенклатуры при условии что - ??? (вот тут подробнее)


Я понял что НормыРасходов и ТехОперации -->> подчинен Номенклатура
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #14 - 16. Июня 2009 :: 10:15
Печать  
Злой Бобр писал(а) 16. Июня 2009 :: 10:08:
Я чего-то туплю.
Есть 3 справочника: Номенклатура, НормыРасходов (подчинен Номенклатура), ТехОперации (кому подчинен ?).
В итоге я так понимаю нужно отобрать список Номенклатуры при условии что - ??? (вот тут подробнее)


ТехОперации не подчинен а связан с Нормами 1 ко многим (т.е. технологическая операция печать может быть для разной продукции)
но продукция может состоять так же из узлов, например комплекты, где узлами являются другая продукция например спортивный костюм состоит из штанов и куртки.
Нужно сказать есть ли в данной продукции данная технологическая операция , даже если это комплект и данная технологическая операция принадлежит его узлу.
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: вложенный запрос
Ответ #15 - 16. Июня 2009 :: 10:20
Печать  
Т.е. ТехОперации это НормыРасходов.Реквизит ? Если да то как он правильно называется и какой тип (вид) имеет? А то что-то непонятно в коде.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #16 - 16. Июня 2009 :: 10:20
Печать  
Номенклатура:

------------
штаны
------------
куртка
------------
костюм
------------

ТехОперации:

------------
печать
------------
пошив
------------

НормыРасходов:

----------------------------------
Владелец      | Имя      | Значение|
----------------------------------
костюм      | Имя1| куртка      |
----------------------------------
костюм      | Имя1| штаны    |
----------------------------------
куртка      | Имя1| печать   |
----------------------------------
куртка      | Имя2| пошив    |
----------------------------------
штаны      | Имя3| пошив    |
----------------------------------

хочу знать где есть печать?
Результат куртка и костюм
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #17 - 16. Июня 2009 :: 10:25
Печать  
leov-001 писал(а) 16. Июня 2009 :: 10:04:
Код
Выбрать все
ТекстЗапроса = "
|SELECT
|  Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов]
|, Спр.PARENTEXT as [Владелец $Справочник.Номенклатура]
|, $Спр.Элемент as [Элемент $Справочник]
|, спрПрод.ID  as ЭлементИД
|FROM
|  $Справочник.НормыРасходов as Спр
|  LEFT JOIN $Справочник.ТехОперации as спрТО ON $ВидСправочника36.ТехОперации+спрТО.ID = $Спр.Элемент AND спрТО.ID = :ВыбПечать
|  LEFT JOIN $Справочник.Номенклатура as спрПрод ON $ВидСправочника36.Номенклатура + спрПрод.ID = $Спр.Элемент
|WHERE
|  Спр.IsFolder = 2 AND
|  Спр.IsMark = ''  AND
|  Спр.PARENTEXT = :УсловиеПродукция OR
|  Спр.PARENTEXT IN (SELECT ID From $Справочник.Номенклатура)
|";
 


здесь выдал все содержимое справочника Нормы расходов, долго отрабатывал 300 тыс строк.
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: вложенный запрос
Ответ #18 - 16. Июня 2009 :: 10:33
Печать  
Ну наконец я понял. Щас пойду пообедаю и потом нарисую тебе запрос.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #19 - 16. Июня 2009 :: 10:37
Печать  
Злой Бобр писал(а) 16. Июня 2009 :: 10:33:
Ну наконец я понял. Щас пойду пообедаю и потом нарисую тебе запрос.

ОЧЕНЬ РАД  Очень довольный  только я счас убегаю поэтому заранее благодарен, надеюсь увидеть завтра, потому как подозреваю, что будут вопросы))) ведь учусь.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: вложенный запрос
Ответ #20 - 16. Июня 2009 :: 14:31
Печать  
Типа такого?
SELECT Элемент FROM Справочник Where Значение=Печать
UNION ALL
SELECT Элемент FROM Справочник Where Значение in (SELECT Элемент FROM Справочник Where Значение=Печать)
  
Наверх
ICQ  
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #21 - 17. Июня 2009 :: 03:42
Печать  
Salimbek писал(а) 16. Июня 2009 :: 14:31:
Типа такого?
SELECT Элемент FROM Справочник Where Значение=Печать
UNION ALL
SELECT Элемент FROM Справочник Where Значение in (SELECT Элемент FROM Справочник Where Значение=Печать)


что то типа того , только второй селект нужен с джоином
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #22 - 17. Июня 2009 :: 03:45
Печать  
вот так сделал - помогло, но можно же, как то оптимизировать!?
|SELECT
|      Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов],
|      Спр.PARENTEXT as [Владелец $Справочник.Номенклатура],
|      $Спр.Элемент as [Элемент $Справочник]
|FROM
|      $Справочник.НормыРасходов as Спр
|WHERE
|      Спр.IsFolder = 2 AND
|      Спр.IsMark = ''
|      AND $Спр.Элемент = :ВыбПечать~
|      AND Спр.PARENTEXT = :УсловиеПродукция
|Union All
|SELECT
|      Спр.ID as [ТекущийЭлемент $Справочник.НормыРасходов],
|      Спр.PARENTEXT as [Владелец $Справочник.Номенклатура],
|      $Спр.Элемент as [Элемент $Справочник]
|FROM
|      $Справочник.НормыРасходов as Спр
|WHERE
|      Спр.IsFolder = 2 AND
|      Спр.IsMark = ''
|      AND $Спр.Элемент = :ВыбПечать~
|      AND Спр.PARENTEXT IN
|(
|SELECT
|      спрПрод.ID  as ЭлементИД
|FROM
|      $Справочник.НормыРасходов as Спр
|LEFT JOIN
|      $Справочник.Номенклатура as спрПрод ON ($ВидСправочника36.Номенклатура + спрПрод.ID = $Спр.Элемент)
|WHERE
|      Спр.IsFolder = 2 AND
|      Спр.IsMark = ''
|AND      
|      Спр.PARENTEXT = :УсловиеПродукция
|      OR Спр.PARENTEXT = спрПрод.ID)
|";
  
Наверх
 
IP записан
 
OnCheck
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 130
Зарегистрирован: 12. Декабря 2007
Re: вложенный запрос
Ответ #23 - 17. Июня 2009 :: 07:31
Печать  
Спасибо напарнику! Оптимизированный вариант того же самого:
ТекстЗапроса = "
|SELECT
|      СпрН.ID as [ТекЭл $Справочник.Номенклатура]
|      ,СпрНК.ID as [ТекЭлК $Справочник.Номенклатура]
|FROM
|      $Справочник.ТехОперации as СпрТО
|JOIN
|      $Справочник.НормыРасходов as СпрНР ON ($СпрНР.Элемент = $ВидСправочника36.ТехОперации + СпрТО.ID)
|JOIN
|      $Справочник.Номенклатура as СпрН ON (СпрНР.PARENTEXT=СпрН.ID)
|LEFT JOIN
|      $Справочник.НормыРасходов as СпрНРК ON ($СпрНРК.Элемент = $ВидСправочника36.Номенклатура + СпрН.ID)
|LEFT JOIN
|      $Справочник.Номенклатура as СпрНК ON (СпрНРК.PARENTEXT=СпрНК.ID)
|WHERE
|      СпрНР.IsFolder = 2
|      ANDСпрНР.IsMark = ''
|      СпрТО.ID = :ВыбПечать
|      AND (СпрН.ID = :УсловиеПродукция
|      OR  СпрНК.ID = :УсловиеПродукция
|)
|";
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать