Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как отобрать только 1 категорию контрагента, если их больше 1?? (число прочтений - 2039 )
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Как отобрать только 1 категорию контрагента, если их больше 1??
22. Ноября 2010 :: 14:14
Печать  
Спр.КатегорииКонтрагентов подчинен спр.Контрагенты.
в карточке контрагента может быть пусто или 1 или несколько категорий.
если использовать код
Код
Выбрать все
    |   LEFT JOIN $Справочник.КатегорииКонтрагентов as СпрКатегорииПокупателей ON СпрКатегорииПокупателей.ParentExt = $Рег.Покупатель AND СпрКатегорииПокупателей.IsMark = 0
 


то при 2-х категориях задваивает результат по контрагенту.

можно как-то отбирать первую попавшуюся или любую?
просто не хочется то включать в запрос строку, то выключать.

спасибо за помощь.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #1 - 22. Ноября 2010 :: 14:48
Печать  
Код
Выбрать все
SELECT $Рег.Покупатель [Контрагент $Справочник.Контрагенты]
  ,MAX(СпрКатегорииПокупателей.ID) [КатегорияКонтрагента $Справочник.КатегорииКонтрагентов]
FROM ...
LEFT JOIN $Справочник.КатегорииКонтрагентов as СпрКатегорииПокупателей ON СпрКатегорииПокупателей.ParentExt = $Рег.Покупатель AND СпрКатегорииПокупателей.IsMark = 0
GROUP BY $Рег.Покупатель 

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


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #2 - 22. Ноября 2010 :: 17:41
Печать  
спасибо.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #3 - 23. Ноября 2010 :: 06:19
Печать  
можно вообще не джойниить и группировать, а заюзать корелляционное поле.
Код
Выбрать все
select
    ....
    (select top 1 СпрКатегорииПокупателей.ID
     from $Справочник.КатегорииКонтрагентов as СпрКатегорииПокупателей
     where СпрКатегорииПокупателей.ParentExt = $Рег.Покупатель AND СпрКатегорииПокупателей.IsMark = 0
    ) [КатегорияКонтрагента $Справочник.КатегорииКонтрагентов]
 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #4 - 23. Ноября 2010 :: 06:35
Печать  
orefkov писал(а) 23. Ноября 2010 :: 06:19:
можно вообще не джойниить и группировать, а заюзать корелляционное поле.

А разве джойн не быстрее подзапроса?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #5 - 23. Ноября 2010 :: 06:47
Печать  
Dmitry The Wing писал(а) 23. Ноября 2010 :: 06:35:
orefkov писал(а) 23. Ноября 2010 :: 06:19:
можно вообще не джойниить и группировать, а заюзать корелляционное поле.

А разве джойн не быстрее подзапроса?

Ну, вообще-то кроме джойна тут еще и группировка добавиться, а так - нужно смотреть план запроса в обоих случаях.
Кроме того, при отработки джойна необходимо будет перебрать все записи в подчиненном справочнике для данного контрагента, для поиска max(id), тк нет индекса (parentext,id). В кореляционном поле - выберет первую запись и успокоиться.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #6 - 23. Ноября 2010 :: 09:27
Печать  
mc писал(а) 22. Ноября 2010 :: 14:14:
Спр.КатегорииКонтрагентов подчинен спр.Контрагенты.
в карточке контрагента может быть пусто или 1 или несколько категорий.
если использовать код
Код
Выбрать все
    |   LEFT JOIN $Справочник.КатегорииКонтрагентов as СпрКатегорииПокупателей ON СпрКатегорииПокупателей.ParentExt = $Рег.Покупатель AND СпрКатегорииПокупателей.IsMark = 0
 


то при 2-х категориях задваивает результат по контрагенту.

можно как-то отбирать первую попавшуюся или любую?
просто не хочется то включать в запрос строку, то выключать.

спасибо за помощь.

Может тебе нужно добавлять в результат если есть хотя бы одна категория  а сама категория не нужна ?
Также скажи речь об sql или dbf ?
  
Наверх
 
IP записан
 
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как отобрать только 1 категорию контрагента, если их больше 1??
Ответ #7 - 23. Ноября 2010 :: 11:43
Печать  
Z1 писал(а) 23. Ноября 2010 :: 09:27:
mc писал(а) 22. Ноября 2010 :: 14:14:
Спр.КатегорииКонтрагентов подчинен спр.Контрагенты.
в карточке контрагента может быть пусто или 1 или несколько категорий.
если использовать код
Код
Выбрать все
    |   LEFT JOIN $Справочник.КатегорииКонтрагентов as СпрКатегорииПокупателей ON СпрКатегорииПокупателей.ParentExt = $Рег.Покупатель AND СпрКатегорииПокупателей.IsMark = 0
 


то при 2-х категориях задваивает результат по контрагенту.

можно как-то отбирать первую попавшуюся или любую?
просто не хочется то включать в запрос строку, то выключать.

спасибо за помощь.

Может тебе нужно добавлять в результат если есть хотя бы одна категория  а сама категория не нужна ?
Также скажи речь об sql или dbf ?

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