Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Проблема в написании запроса (число прочтений - 2125 )
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Проблема в написании запроса
30. Мая 2012 :: 12:23
Печать  
Добрый день,нужна помощь при составлении запроса!
Ситуация:
1)Есть справочник Номенклатура и его аналоги(подчиненный номенклатуре).
Пример:
Есть три гусеницы :
Гусеница 1(имеющая аналоги Гусеница 2 и Гусеница 3)
Гусеница 2 (имеющая аналоги Гусеница 1 и Гусеница 3)
Гусеница 3 (имеющая аналоги Гусеница 2 и Гусеница 1)
Необходимо на выходе получить информацию о том,что данные три позиции являются аналогами.  я вижу решение такое: собрать все аналоги с владельцами отсортировать в любом удобном порядке,таким образом выявив приоритетный аналог,и получить значение которое присвоить всем остальным. Результат

Номенклатура:         Аналоги:                             Приоритет
Гусеница 1            Гусеница 2,Гусеница 3           Гусеница 1
Гусеница 2            Гусеница 1,Гусеница 3           Гусеница 1
Гусеница 3            Гусеница 1,Гусеница 2           Гусеница 1
Гусеница 4            ................                             Гусеница 4
Гусеница 5            ................                             Гусеница 4
Гусеница 6            ................                             Гусеница 4
По значению в последней колонке понимаю что аналоги есть две группы аналогов.
Текст запроса которым получаю номенклатуру с аналогами:
|SELECT
     |#Номенклатура.Val as [Номенклатура $Справочник.Номенклатура],
     |COALESCE(ВыборкаАналогов.Аналог,$ПустойИД) as [Аналог $Справочник.Номенклатура]
     |FROM
     |#Номенклатура
     |LEFT JOIN
     |(SELECT
     |      ВыборкаВерхнийУровень.Аналог as Аналог,
     |      ВыборкаВерхнийУровень.Номенклатура as Номенклатура
     | FROM
     |      (
     |      SELECT DISTINCT
     |      $Спр.Аналог as Аналог,
     |      Спр.ParentExt as Номенклатура
     |      FROM
     |      $Справочник.АналогиНоменклатуры1 as Спр (NoLock)
     |      WHERE
     |      Спр.ParentExt in (SELECT val from #Номенклатура)
     |      UNION ALL
     |      SELECT DISTINCT
     |      Аналоги.ParentExt as Аналог,
     |      Аналоги.ParentExt as Номенклатура
     |      FROM
     |      $Справочник.АналогиНоменклатуры1 as Аналоги (NoLock)
     |      JOIN #Номенклатура On Аналоги.ParentExt = #Номенклатура.Val
     |      ) as ВыборкаВерхнийУровень
     //|      ORDER BY
     //|      ВыборкаВерхнийУровень.Аналог
     |) as ВыборкаАналогов ON ВыборкаАналогов.Номенклатура = #Номенклатура.Val
     |
     |";
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Проблема в написании запроса
Ответ #1 - 30. Мая 2012 :: 12:58
Печать  
Весьма забавное объединение..
не вижу смысла в объединении

$Спр.Аналог as Аналог и  Аналоги.ParentExt

зачем ?
  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Проблема в написании запроса
Ответ #2 - 30. Мая 2012 :: 13:09
Печать  
Ну тем самым хотел внести в список самого Владельца чтобы он входил в список аналогов,типа гусеница 1 является аналогом гусенице 1,может это не правильно конечно.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Проблема в написании запроса
Ответ #3 - 30. Мая 2012 :: 13:26
Печать  
конечно не правильно - если тебе потом нужнео будет выбрать "рандомный" первый попавшийся аналог - усё, привет - им может быть сам владелец в твоём случае. что не верно.

А так может и просто через коррелированный подзапрос выбрать первый попавшийся аналог, тип того:

Код
Выбрать все
|SELECT
|#Номенклатура.Val as [Номенклатура $Справочник.Номенклатура],
|(SELECT top 1
|	$Спр.Аналог as Аналог
|	FROM
|	$Справочник.АналогиНоменклатуры1 as Спр (NoLock)
|	where   Спр.ParentExt    = #Номенклатура.Val
|	order by  Спр.id --тут как тебе нужно так и сортируй, приоритет аналогов типа
| ) as [Аналог $Справочник.Номенклатура]
|from #Номенклатура 

  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Проблема в написании запроса
Ответ #4 - 30. Мая 2012 :: 18:13
Печать  
Просто может неправильно поставил вопрос,но мне важнее узнать по средством запроса группу аналогичных товаров и поэтому владелец - аналог владелец(как тупо это не звучало бы) мне нужно знать,чтобы сформировать эту полную группу аналогов (Гусеница 3,Гусеница 2,Гусеница 1,Гусеница 4),потом ,зная эту группу и отсортировав в удобном для себя виде,например по наименованию, создал новую колонку,куда и проставить первый элемент из списка аналогичных товаров,т.е. Гусеница 1,тем самым буду знать группу аналогичных товаров,на выходе получить:
Гусеница 1   Гусеница 1
Гусеница 2   Гусеница 1
Гусеница 3   Гусеница 1
Гусеница 4   Гусеница 1
Может способ и кривой,но первое что пришло в голову.Если есть другие варианты,то внимательно выслушаю их.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема в написании запроса
Ответ #5 - 30. Мая 2012 :: 21:10
Печать  
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Проблема в написании запроса
Ответ #6 - 31. Мая 2012 :: 03:24
Печать  
С учетом ссылки berezdetsky, я бы сказал, что имеет место ошибка в проектировании.

Если заменяемость взаимная (т.е. если А является заменителем B, то автоматически и B является заменителем А; и как следствие - если А <-> B и B <-> С, то А <-> С), то я бы задумался о реквизите "Ведущий артикул", куда писать ссылку на один из материалов взаимозаменяемости (любой, но всюду одинаковый). Более того, если все товары равноприоритетные, то всю взаимозаменяемость можно построить на этом реквизите (без подчиненного справочника).

Если же заменяемость однонаправленная, то тут сложнее. Ибо для тех товаров, для которых заменяемость все же взаимная, от циклических ссылок не обойтись (а самый ужас, это циклы вида A -> B, B -> C, C -> A) - но там и постановки задач, обычно, другие.


Upd.
Кстати, в первом случае это может быть не "Ведущий артикул", а "Группа аналогов" (со ссылкой на другой справочник)
  
Наверх
 
IP записан
 
IoWa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 15. Декабря 2010
Re: Проблема в написании запроса
Ответ #7 - 31. Мая 2012 :: 05:18
Печать  
Доброе утро,да,действительно мною вопрос с аналогами уже поднимался. Про создание реквизита,тоже мысль приходила,теперь понимаю,что это будет самый оптимальный вариант,ведь в моем случае об однонаправленной заменяемости никакой речи идти не может.Спасибо всем за участие в решении данного вопроса!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать