Имя: Пароль:
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 рублей на хлеб. Смотри, не перепутай!
Найди отличия от первых пяти ответов.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn