Имя: Пароль:
1C
1С v8
Как избавиться от дублей в запросе?
,
0 Gorr
 
13.11.13
11:19
Имеем справочник из которого необходимо выбрать все элементы без дублей. Критерием дублей будем считать наименование элементов. В результате запроса надо получить два поля наименование и ссылку на элемент справочника.
Например содержимое справочника может быть:
Иванов Ссылка01
Петров Ссылка02
петров Ссылка03
сидоров Ссылка04
сидоров Ссылка05
В результате запроса хотим получить:
Иванов Ссылка01
Петров Ссылка02
Сидоров Ссылка04
Проблема в том, что запрос

Выбрать Наименование
ИЗ Справочник.Сотрудники
Сгруппировать по Наименование
Имеющие Количество (*) > 1

вернет три записи но без ссылки на сами элементы.
Проблема в том что Поле Ссылка уникально в пределах справочника и
при включении поля в состав выбираемых полей возвращаются все записи.
1 Molinor
 
13.11.13
11:20
А почему не:
Иванов Ссылка01
Петров Ссылка03
Сидоров Ссылка05
?
2 WildSery
 
13.11.13
11:20
(0) МИНИМУМ(Ссылка), например.
3 elCust
 
13.11.13
11:22
По моему изначально задача не корректна.
4 WildSery
 
13.11.13
11:24
*некорректна :)
5 Ofizer
 
13.11.13
11:25
(3) +1
может быть наоборот выбрать дублей, и принять решение как от них избавиться?
6 elCust
 
13.11.13
11:26
(4) Молодец! Разрешаю записать себе +1.
7 Ненавижу 1С
 
гуру
13.11.13
11:26
Выбрать Наименование, МИНИМУМ(Ссылка)
ИЗ Справочник.Сотрудники
Сгруппировать по Наименование

какой вопрос, такой ответ
8 WildSery
 
13.11.13
11:28
(5) Можно даже обработку замены дублей порекомендовать.
(6) Я не спрашивал разрешения :)
(7) Эхо!
9 Gorr
 
13.11.13
11:44
Благодарю за МИНИМУМ!
На самом деле без разницы какую ссылку выбрать в результат.  Мое дело предложить клиенту варианты решения: Либо алгоритм обрезающий дубли либо предоставить все дубли для принятия решения. Скорее всего заморачиваться с корректировкой дублей просто не захотят (нужно перенести НСИ в другую базу).
10 Gorr
 
13.11.13
12:09
Чиста теоретически была еще мысль для выбора какую ссылку взять в результат использовать конструкцию TOP 1, но как это сделать мысль далее не пошла))
11 Serginio1
 
13.11.13
12:22
12 mikecool
 
13.11.13
12:24
чтобы избавиться от дублей, надо вообще понять как и что выбирается, и тогда все будет просто
13 Serginio1
 
13.11.13
12:25
14 Gorr
 
13.11.13
14:38
(11) благодарю за развитие мысли.
В итоге получилось два решения результаты которых почему-то отличаются. Быть может у кого будут идеи?
Вариант1:
ВЫБРАТЬ Ссылка, Наименование
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
    Справочник.Номенклатура
ГДЕ
    Ссылка в ИЕРАРХИИ (&ГруппаНоменклатуры)
;
ВЫБРАТЬ Наименование
ПОМЕСТИТЬ ВТ_ДублиНаименований
ИЗ
    ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
;
ВЫБРАТЬ МАКСИМУМ(Ссылка)
ПОМЕСТИТЬ ВТ_СсылкиБезДублей
ИЗ ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
;
ВЫБРАТЬ Ссылка
ПОМЕСТИТЬ ВТ_РЕЗУЛЬТАТ
ИЗ ВТ_Номенклатура
ГДЕ НЕ Наименование В (ВЫБРАТЬ * ИЗ ВТ_ДублиНаименований)
ОБЪЕДИНИТЬ
ВЫБРАТЬ *
ИЗ ВТ_СсылкиБезДублей
;
ВЫБРАТЬ Количество(*) из ВТ_РЕЗУЛЬТАТ

Вариант2:
Выбрать Ссылка
Поместить ВТ_Номенклатура
ИЗ Справочник.Номенклатура как Номенклатура
ГДЕ Ссылка В (Выбрать первые 1 Ссылка ИЗ Справочник.Номенклатура как спр где спр.Наименование = Номенклатура.Наименование Упорядочить по Наименование убыв)
И Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
//Упорядочить по Наименование ИЕРАРХИЯ
;
Выбрать Количество(*) из ВТ_Номенклатура

Так вот количество записей во втором случае получается менее чем в первом.
15 Serginio1
 
13.11.13
14:56
ВЫБРАТЬ МАКСИМУМ(Ссылка)
ПОМЕСТИТЬ ВТ_СсылкиБезДублей
ИЗ ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = 1
16 Gorr
 
13.11.13
16:05
(15) Цель здесь получить уникальные записи из списка дублирующихся. См.пост 0.
В результат вашего запроса записи с дублинующимися наименованиями не попадут вовсе, что приведет к потере данных.
17 Serginio1
 
13.11.13
16:09
(16) Из самого названия ВТ_СсылкиБезДублей
должно соответствовать ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = 1
18 Gorr
 
13.11.13
16:22
(17) ну уж как назвалось лучше придумать не получилось, но суть - там должны быть ссылки из тех которые дублируются в основной таблице, но в единственном экземпляре
19 Мимохожий Однако
 
13.11.13
16:24
В УТ10.3 есть штатная обработка по поиску и замене дублей. В т.ч. и по наименованию. Возможно, это лучше лисапеда.
20 Gorr
 
13.11.13
16:32
(17) вообще смотрите весь пакет запросов коли речь идет о 1м варианте.
шаг 1 понятно что выбираем только те элементы справочника входящие в определенную группу и помещаем результат в ВТ_Номенклатура. Вся дальнейшая работа осуществляется именно с этим отбором.
шаг 2 определяем какие наимнования дублируются
шаг 3 выбираем из множества дублирующихся записей по одной с каждым наименованием
шаг 4 используем объединение. в первой части запроса выбираем все записи кроме дублирующихся. во второй части запроса добавляем по одной из тех которые дублируются (шаг3).
21 Gorr
 
13.11.13
16:35
(19) это из другой оперы - замена дублей и ремонт базы здесь и не требуется. речь идет о том что нужно переносить, а что нет.
22 Serginio1
 
13.11.13
16:44
(21) В третьем варианте у тебя стоит ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
23 Gorr
 
13.11.13
17:01
(22) да, именно эта конструкция позволяет выбрать дубли (те строки где количество строк с одинаковым наименованием встречается в таблице более одоного раза) из общего множества записей. что тут непонятного?
24 Gorr
 
13.11.13
17:05
(22) в третьем шаге первого варианта алгоритма, третьего варианта не рассматривалось.
25 Serginio1
 
13.11.13
17:05
Чем  ВТ_ДублиНаименований
отличаются от
ВТ_СсылкиБезДублей
26 Serginio1
 
13.11.13
17:06
Запросы одинаковые
27 Serginio1
 
13.11.13
17:08
Все прошу прощения. Они разные в первом случае Наименование во втором ссылки.
Я так понимаю ссылок больше 1 быть не может?
28 Gorr
 
13.11.13
17:12
(26) ДА НИФИГА!
см пример исходных таблиц из 0.
первый возвращает
Петров
Сидоров
второй возвращает
Ссылка03
Ссылка05
29 Serginio1
 
13.11.13
17:15
28 Точно второй что либо возвращает при условии ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1

Судя по первому запросу никаких дублей ссылок быть не должно
30 Gorr
 
13.11.13
20:02
(29)  ессно having count(*) > 1 это классика жанра.
ссылки уникальны по своей природе. мы говорим об элементах с динаковым наименованием. почему вы не можете внимательно прочитать топик?
31 Serginio1
 
13.11.13
21:12
Ясно прошу прощения не доконцо досмотрел.
Итак
ВЫБРАТЬ Наименование
ПОМЕСТИТЬ ВТ_ДублиНаименований
ИЗ
    ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
;

выбирает дубли наименований

ВЫБРАТЬ МАКСИМУМ(Ссылка)
ПОМЕСТИТЬ ВТ_СсылкиБезДублей
ИЗ ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
;
Этот запрос аналогичный первому, только еще есть поле Ссылка.

Сделай второй запрос на ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = 1

и получишь однинаковое количество с

Выбрать Ссылка
Поместить ВТ_Номенклатура
ИЗ Справочник.Номенклатура как Номенклатура
ГДЕ Ссылка В (Выбрать первые 1 Ссылка ИЗ Справочник.Номенклатура как спр где спр.Наименование = Номенклатура.Наименование Упорядочить по ссылка убыв)
И Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)

Упорядочивать по наименованию нет смысла, так как стоит условие
спр.Наименование = Номенклатура.Наименование
32 Serginio1
 
13.11.13
21:27
У тебя
ВЫБРАТЬ  Наименование,МАКСИМУМ(Ссылка)
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
    Справочник.Номенклатура
ГДЕ
    Ссылка в ИЕРАРХИИ (&ГруппаНоменклатуры)
СГРУППИРОВАТЬ ПО Наименование

должно выдать то же что и

Выбрать Номенклатура.Наименование,Номенклатура.Ссылка
ИЗ Справочник.Номенклатура как Номенклатура
ГДЕ Ссылка В (Выбрать первые 1 Ссылка ИЗ Справочник.Номенклатура как спр где спр.Наименование = Номенклатура.Наименование Упорядочить по Наименование убыв)
И Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
33 GANR
 
14.11.13
01:35
(0) >как избавиться от дублей в запросе
легко :)
34 Sammo
 
14.11.13
03:55
3 варианта избавлния от дублей
1. distinct
2. группирующие функции
3. а ля срез последних
35 Gorr
 
14.11.13
11:11
Вопрос можно считать закрытым. По первому варианту все корректно перенеслось.
36 Serginio1
 
14.11.13
11:24
(35) Ты для начала сравни первый и второй вариант на полное объединение по наименованию и посмотри различия.
Смотри 31
37 Gorr
 
21.11.13
15:20
в итоге получилось так:

ВЫБРАТЬ
    МИНИМУМ(Номенклатура.Ссылка) КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура

СГРУППИРОВАТЬ ПО
    Номенклатура.Наименование

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) = 1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    МИНИМУМ(Номенклатура.Ссылка)
ИЗ
    Справочник.Номенклатура КАК Номенклатура

СГРУППИРОВАТЬ ПО
    Номенклатура.Наименование

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1
38 dk
 
21.11.13
15:33
всю ветку не читал, но чем (37) отличается от

ВЫБРАТЬ
    МИНИМУМ(Номенклатура.Ссылка)
ИЗ
    Справочник.Номенклатура КАК Номенклатура

СГРУППИРОВАТЬ ПО
    Номенклатура.Наименование

?
39 Gorr
 
21.11.13
15:44
(38) да ничем. ваш вариант и оставлю. поздравляю!
40 WildSery
 
22.11.13
14:02
(39) Вот тебе 100 рублей на молоко, а вот 100 рублей на хлеб. Смотри, не перепутай!
Найди отличия от первых пяти ответов.