Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) группировка по коду и родителю (число прочтений - 5644 )
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
группировка по коду и родителю
18. Декабря 2008 :: 08:31
Печать  
Начал изучать 1cpp. Пробую получить элементы справочника с неуникальными кодами. Справочник подчинен. Серии кодов в пределах подчинения. Собственно не работающий запрос:
|SELECT
|  Спр.ID [Элемент $Справочник."+ТекСправочник+"],
|  Спр.Code as Код
|FROM
|  $Справочник."+ТекСправочник+" as Спр
|WHERE
|      Спр.Code IN
|   (SELECT
|       Спр1.Code,
|       Спр1.ParentExt
|   FROM
|       $Справочник."+ТекСправочник+" as Спр1
|   GROUP BY
|       Спр1.Code, Спр1.ParentExt
|   HAVING
|       COUNT(*) > 1)
|ORDER BY
|    Спр.Code
|";                     
Как сгруппировать одновременно по коду и владельцу, чтоб найти неуникальность?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #1 - 18. Декабря 2008 :: 09:22
Печать  
Код
Выбрать все
SELECT    Спр1.ParentExt,Спр1.Code,count(1)
FROM      $Справочник."+ТекСправочник+" as Спр1
GROUP BY  Спр1.ParentExt,Спр1.Code
HAVING    count(1) > 1 

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


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: группировка по коду и родителю
Ответ #2 - 18. Декабря 2008 :: 11:11
Печать  
неполучается
State 42000, native 116, message [Microsoft][ODBC SQL Server Driver][SQL Server]Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #3 - 18. Декабря 2008 :: 11:33
Печать  
у меня работает.
для начала попробуй запрос получить с
помощью
Запрос.Отладка(1)
проверь запрос sql в  qa
после если не получиться то запрос sql выкладывай здесь.
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: группировка по коду и родителю
Ответ #4 - 18. Декабря 2008 :: 11:48
Печать  
из отладки для справочника Партии
SELECT
  Спр.ID [Элемент $Справочник.Партии],
  Спр.Code as Код
FROM
  sc214 as Спр
WHERE
     Спр.Code IN
   (SELECT
      Спр1.ParentExt, Спр1.Code, count(1)
   FROM
      sc214 as Спр1
   GROUP BY
      Спр1.ParentExt, Спр1.Code
   HAVING
      COUNT(1) > 1)
ORDER BY
    Спр.Code
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #5 - 18. Декабря 2008 :: 11:53
Печать  
vovan519 писал(а) 18. Декабря 2008 :: 11:48:
из отладки для справочника Партии
SELECT
 Спр.ID [Элемент $Справочник.Партии],
 Спр.Code as Код
FROM
 sc214 as Спр
WHERE
     Спр.Code IN
  (SELECT
      Спр1.ParentExt, Спр1.Code, count(1)
  FROM
      sc214 as Спр1
  GROUP BY
      Спр1.ParentExt, Спр1.Code
  HAVING
      COUNT(1) > 1)
ORDER BY
   Спр.Code

просил же то что выдаст Отладка(1) а не код 1с.
Ошибка в том что сортировать можно только результирущее
множество, а подзапрос нельзя. Да и не нужен он (ИХМО)

немного не так что у тебя выдаст подзапрос и как это можно интерпритировать
т.е. у тебя получается
Спр.Code IN ( code, Id, количество ). Получай ТЗ в 1с как написано
в post 1, а дальше делай с ней что-то.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #6 - 18. Декабря 2008 :: 23:13
Печать  
Может это поможет, лень вспоминать как сделал
http://infostart.ru/projects/1096/
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: группировка по коду и родителю
Ответ #7 - 19. Декабря 2008 :: 07:30
Печать  
Z1 Не понял на счет сортировки в подзапросе. Вроде order за скобкой подзапроса. Да и получить хочется именно результирующую таблицу, а не таблицу со всеми ссылками.
Вадимко. Не работает. Те же ошибочные сообщения, что и у всех.

Ладно, уговорили полезу в документцию. Спасибо за участие.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #8 - 19. Декабря 2008 :: 08:08
Печать  
vovan519 писал(а) 19. Декабря 2008 :: 07:30:
Z1 Не понял на счет сортировки в подзапросе. Вроде order за скобкой подзапроса. Да и получить хочется именно результирующую таблицу, а не таблицу со всеми ссылками.

Ладно, уговорили полезу в документцию. Спасибо за участие.

насчет order скобку не заметил сначала.
ну и не видел я чтобы в подзапросах нужна была сортировка.

Чтобы получить результир таблицу сделай в (1)
для поля  Спр1.ParentExt типизацию и по inner join добавь элементы с повторяющимися кодами.
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: группировка по коду и родителю
Ответ #9 - 19. Декабря 2008 :: 14:05
Печать  
Спасибо Z1 за поддержку.
Спасибо, что заставили покопаться в документации. Получил то, что хотел.
SELECT Спр.ID [Элемент $Справочник."+ТекСправочник+"], Спр.Code as Код
FROM   $Справочник."+ТекСправочник+" as Спр
WHERE  EXISTS
   (SELECT Спр1.Code, Спр1.ParentExt, COUNT(*)
    FROM   $Справочник."+ТекСправочник+" as Спр1
    WHERE  Спр.Code = Спр1.Code
    GROUP  BY Спр1.ParentExt, Спр1.Code
    HAVING COUNT(*) > 1)
ORDER BY Спр.Code
Только насколько этот запрос оптимальный?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #10 - 19. Декабря 2008 :: 14:16
Печать  
vovan519 писал(а) 19. Декабря 2008 :: 14:05:
Спасибо Z1 за поддержку.
Спасибо, что заставили покопаться в документации. Получил то, что хотел.
SELECT Спр.ID [Элемент $Справочник."+ТекСправочник+"], Спр.Code as Код
FROM   $Справочник."+ТекСправочник+" as Спр
WHERE  EXISTS
  (SELECT Спр1.Code, Спр1.ParentExt, COUNT(*)
   FROM   $Справочник."+ТекСправочник+" as Спр1
   WHERE  Спр.Code = Спр1.Code
   GROUP  BY Спр1.ParentExt, Спр1.Code
   HAVING COUNT(*) > 1)
ORDER BY Спр.Code
Только насколько этот запрос оптимальный?

очень неоптимальный.
потому что скорее всего дублей у тебя мало 1-2% от общего количества а может быть еще меньше.
Т.е для каждой строки запроса sql генерирует колерированный подзапрос и очень редко находит дубли.
Если элементов в справочнике < 10 000 оставить как есть, если больше 10 000 или есть желание улучшить то надо переписать по другому
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: группировка по коду и родителю
Ответ #11 - 19. Декабря 2008 :: 14:35
Печать  
Может кто объяснит на примере, чтоб было понятнее.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #12 - 19. Декабря 2008 :: 14:38
Печать  
Код
Выбрать все
SELECT Спр_000.ID [Элемент $Справочник."+ТекСправочник+"], Спр_000.Code as Код,Спр_000.ParentExt
FROM   $Справочник."+ТекСправочник+" as Спр_000
inner join (
           SELECT Спр1.Code, Спр1.ParentExt, COUNT(*)
           FROM   $Справочник."+ТекСправочник+" as Спр1
           WHERE  Спр.Code = Спр1.Code
           GROUP  BY Спр1.ParentExt, Спр1.Code
           HAVING COUNT(*) > 1
) as tabl_1 on   Спр_000.ParentExt = tabl_1.ParentExt
            and  Спр_000.Code      = tabl_1.Code
ORDER  BY Спр_000.ParentExt,Спр_000.Code
 


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


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: группировка по коду и родителю
Ответ #13 - 19. Декабря 2008 :: 20:51
Печать  
Пока еще не осознал тонкость и порядок выполнения подзапросов, но думаю разберусь. Спасибо за пример, осталось понять разницу.
Ну и пока не понял зачем у тебя WHERE в подзапросе.
Но в любом случае буду экспериментировать в понедельник.
Кстати мой запрос на 70.000 записях отрабатывает меньше секунды. Наверно буду мерить точнее, чтоб увидеть разницу.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: группировка по коду и родителю
Ответ #14 - 20. Декабря 2008 :: 21:21
Печать  
vovan519 писал(а) 19. Декабря 2008 :: 07:30:
Вадимко. Не работает. Те же ошибочные сообщения, что и у всех.


Все там работает иначе бы сам не пользовался... ладно, замяли
  

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