|
Как избавиться от дублей в запросе? | ☑ | ||
---|---|---|---|---|
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 рублей на хлеб. Смотри, не перепутай!
Найди отличия от первых пяти ответов. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |