powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DISTINCT
24 сообщений из 24, страница 1 из 1
DISTINCT
    #39680359
petrovichvanya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, подскажите можно ли использовать DISTINCT при объедение таблиц в inner join?
...
Рейтинг: 0 / 0
DISTINCT
    #39680365
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно. Но постановка вопроса намекает о быдло-коддинге.

http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
DISTINCT
    #39680391
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrovichvanyaЗдравствуйте, подскажите можно ли использовать DISTINCT при объедение таблиц в inner join?
Технически - возможно.
По зрелому размышлению - как правило, не нужно.
Практически - ленивые кодеры интенсивно используют, за что время от времени справедливо выхватывают неприятностей.
...
Рейтинг: 0 / 0
DISTINCT
    #39680508
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я, когда вижу дистинкт, всегда требую объяснения нафига
после чего в 90% от него отказываются
...
Рейтинг: 0 / 0
DISTINCT
    #39680536
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrovichvanya,

Тебе все ясно? Чтобы никто не придирался, перепиши distinct через group by.
...
Рейтинг: 0 / 0
DISTINCT
    #39680832
Den Limonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

Скажите, а в чем принципиальное "зло" distinct в тех случаях, когда можно заменить его group by?
...
Рейтинг: 0 / 0
DISTINCT
    #39680835
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Den Limonovв тех случаях, когда можно заменить его group by?Есть случаи, когда результата distinct нельзя получить с помощью group by?
...
Рейтинг: 0 / 0
DISTINCT
    #39680840
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заменять дистинкт групп баем? Для чего?
...
Рейтинг: 0 / 0
DISTINCT
    #39680843
Den Limonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxя, когда вижу дистинкт, всегда требую объяснения нафига
после чего в 90% от него отказываются

andreymxзаменять дистинкт групп баем? Для чего?


"я, когда вижу дистинкт, всегда требую объяснения нафига" - тогда о чем вы?
Если мне нужно вывести уникальные значения, то что лучше - distinct или group by? Результат на выводе как бы одинковый
...
Рейтинг: 0 / 0
DISTINCT
    #39680852
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полагаю, что лучше делать условие выборки из таблиц таким, чтобы не было нужды в distinct.
А то получается что ты выбираешь не нужные тебе данные и соединяешь их со вторым набором строк, а потом дистинктом их отсекаешь. Всё это приводит к бессмысленному расходу вычислительных мощностей.
...
Рейтинг: 0 / 0
DISTINCT
    #39680927
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БельфяПолагаю, что лучше делать условие выборки из таблиц таким, чтобы не было нужды в distinct.
А то получается что ты выбираешь не нужные тебе данные и соединяешь их со вторым набором строк, а потом дистинктом их отсекаешь. Всё это приводит к бессмысленному расходу вычислительных мощностей.Это приводит к тому, что вроде бы работающий запрос через месяц становится нерабочим
Из-за того, то условия уникальности через тот месяц поменялись, и строчек стало больше
...
Рейтинг: 0 / 0
DISTINCT
    #39680929
Den Limonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бельфя,

Из таблицы, хранящей факты продажи необходимо сформировать список проданных товаров за последние три дня. Как-то можно здесь обойтись без distinct/group by?
Есть ли разница, что использовать - distinct имя_товара или select имя_товара..group by имя_товара?
...
Рейтинг: 0 / 0
DISTINCT
    #39680939
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Den LimonovБельфя,

Из таблицы, хранящей факты продажи необходимо сформировать список проданных товаров за последние три дня. Как-то можно здесь обойтись без distinct/group by?
Есть ли разница, что использовать - distinct имя_товара или select имя_товара..group by имя_товара?если есть таблица-справочник товаров, то, как вариант, селект из таблицы справочник где существует (и тут ваше условие о продажах за три дня)
(where exists(select null from <факты продажи> where ... ))
...
Рейтинг: 0 / 0
DISTINCT
    #39680990
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Den LimonovИз таблицы, хранящей факты продажи необходимо сформировать список проданных товаров за последние три дня. Как-то можно здесь обойтись без distinct/group by?
Есть ли разница, что использовать - distinct имя_товара или select имя_товара..group by имя_товара?
1. При наличии справочника - можно.
2. Разница есть.
distinct - это SORT.
group by - может быть как sort group by, так и hash group by.
В варианте hash - может пользоваться преимуществами параллельного исполнения.
...
Рейтинг: 0 / 0
DISTINCT
    #39681004
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

HASH (UNIQUE) ?

Regards

Maxim
...
Рейтинг: 0 / 0
DISTINCT
    #39681035
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Den LimonovСкажите, а в чем принципиальное "зло" distinct в тех случаях, когда можно заменить его group by?Исторически сложилось, что пишушие group by осознают необходимость группировки и, как правило, считают некоторые агрегаты.
А писатели distinct пихают чтобы избавиться от дубликатов, которые часто возникают от неправильного условия соединения или отсутствия необходимых фильтров.
-2-Den Limonovв тех случаях, когда можно заменить его group by?Есть случаи, когда результата distinct нельзя получить с помощью group by?Есть ряд случаев когда результат distinct нельзя получить с помощью group by без дополнительной inline view .

Необходимость создания inline view может тоже навести на некоторые мысли любителей пихать distinct.
...
Рейтинг: 0 / 0
DISTINCT
    #39681059
Den Limonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot dbms_photoshop]Den LimonovИсторически сложилось...
Это правда. Тут не поспоришь.
Спасибо!
...
Рейтинг: 0 / 0
DISTINCT
    #39681109
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopА писатели distinct пихают чтобы избавиться от дубликатов, которые часто возникают от неправильного условия соединения или отсутствия необходимых фильтров.
Причины разные бывают.
Например я иногда делаю так:
Код: plsql
1.
2.
3.
4.
select ids.service_id, a1.value as attr1, a2.value as attr2
from (select distinct service_id from ... ) ids
left join attr a1 on (a1.service_id = ids.service_id and a1.type_id = 1)
left join attr a2 on (a2.service_id = ids.service_id and a2.type_id = 2)


Например есть услуги разных типов с совпадающими логинами и нужно отобрать эти логины развернуть по горизонтали.
Что-то вроде самодельного pivot.
...
Рейтинг: 0 / 0
DISTINCT
    #39681122
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Что-то вроде
собственно, два замечания:
1. distinct тут ничем не лучше group by.
А group by может (посредством having) помочь сразу отобрать именно те сервисы, котоыре требуются
2. Многократные заходы join-ом в attr ради pivot могут, конечно, иметь смысл, но он слегка ускользает, поскольку вполне возможно собрать нужные attr одним заходом и пивотить на case-group by.
Более того, если известно, что из attr требуется собрать хотя бы процентов 30 записей - то может быть выгоднее отдельно сгруппировать атрибуты и отфильтровать по exists в источнике "from ..."
...
Рейтинг: 0 / 0
DISTINCT
    #39681126
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousно он слегка ускользает, поскольку вполне возможно собрать нужные attr одним заходом и пивотить на case-group by
Если собирать с фильтрацией по type_id, то будут пропущены логины, для которых нет услуг соответствующего типа (а в моем варианте по этим логинам будет null).
Если же фильтрацию по type_id не применять, то будут дубли, от которых нужно будет как-то избавляться. В этом случае использование distinct для получения полного списка услуг более красиво и понятно.
...
Рейтинг: 0 / 0
DISTINCT
    #39681135
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.В этом случае использование distinct для получения полного списка услуг более красиво и понятно.Обвешивание distinct-запроса eavом никоим образом не демонстрирует ни красивость, ни понятность приведенного в качестве примера многоточия.
...
Рейтинг: 0 / 0
DISTINCT
    #39681149
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

distinct в inline view выглядит намного более осмысленно чем на самом верхнем уровне.
То есть
Код: plaintext
1.
select *
from t1 join (select distinct from t2) on
вполне себе вариант, а
Код: plaintext
1.
select distinct *
from t1 join t2 on
подозрение на говнокод.

В результате query transformations Oracle сам решит на каком этапе ему эффективней применять distinct.

Ну и все это не меняет того факта, что с атрибутами лучше обойтись единственным соединением.
...
Рейтинг: 0 / 0
DISTINCT
    #39681159
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Если собирать с фильтрацией по type_id, то будут пропущены логины, для которых нет услуг соответствующего типа (а в моем варианте по этим логинам будет null).

Вот Вам с ходу пара вариантов с обратным заходом из атрибутов.
Применять в зависимости от конкретных показаний (селективности предикатов, наличия индексов, потребности в первых строках или в общей статистике, располагаемой памяти pga и т.п.)
Серебряной пули нет.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with attrs_agg as ( 
        select service_id
             , max(case type_id when 1 then value end) attr1
             , max(case type_id when 2 then value end) attr2
          from attr
         where service_id > 0 and type_id in(1,2)
         group by service_id
)
, ids as (select service_id 
            from ...
           group by service_id
           having ... -- отсечка по агрегатам. 
               -- К примеру, только имеющие более одной записи service_id
                  count(*) > 1
          )
select *
  from ids ids, attrs_agg a
 where ids.service_id = a.service_id(+)
;


  select service_id
       , max(case type_id when 1 then value end) attr1
       , max(case type_id when 2 then value end) attr2
    from attr a
   where exists(select null from ... where service_id = a.service_id)
   group by service_id
;
...
Рейтинг: 0 / 0
DISTINCT
    #39681265
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выглядит довольно монстрообразно.
Неужели внешний джойн настолько "тяжел", что агрегатная функция в подобной конструкции (case внутри max) все равно эффективнее?
Я поверю на слово, но все равно странно, что для реляционной базы данных, суть которой в связях, лишний джойн это настолько "дорогая" операция.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DISTINCT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]