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

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

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

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

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


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

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

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

HASH (UNIQUE) ?

Regards

Maxim
...
Рейтинг: 0 / 0
30.07.2018, 13:23
    #39681035
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
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
30.07.2018, 13:46
    #39681059
Den Limonov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
[quot dbms_photoshop]Den LimonovИсторически сложилось...
Это правда. Тут не поспоришь.
Спасибо!
...
Рейтинг: 0 / 0
30.07.2018, 15:01
    #39681109
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
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
30.07.2018, 15:18
    #39681122
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
Alibek B.Что-то вроде
собственно, два замечания:
1. distinct тут ничем не лучше group by.
А group by может (посредством having) помочь сразу отобрать именно те сервисы, котоыре требуются
2. Многократные заходы join-ом в attr ради pivot могут, конечно, иметь смысл, но он слегка ускользает, поскольку вполне возможно собрать нужные attr одним заходом и пивотить на case-group by.
Более того, если известно, что из attr требуется собрать хотя бы процентов 30 записей - то может быть выгоднее отдельно сгруппировать атрибуты и отфильтровать по exists в источнике "from ..."
...
Рейтинг: 0 / 0
30.07.2018, 15:24
    #39681126
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
andrey_anonymousно он слегка ускользает, поскольку вполне возможно собрать нужные attr одним заходом и пивотить на case-group by
Если собирать с фильтрацией по type_id, то будут пропущены логины, для которых нет услуг соответствующего типа (а в моем варианте по этим логинам будет null).
Если же фильтрацию по type_id не применять, то будут дубли, от которых нужно будет как-то избавляться. В этом случае использование distinct для получения полного списка услуг более красиво и понятно.
...
Рейтинг: 0 / 0
30.07.2018, 15:31
    #39681135
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
Alibek B.В этом случае использование distinct для получения полного списка услуг более красиво и понятно.Обвешивание distinct-запроса eavом никоим образом не демонстрирует ни красивость, ни понятность приведенного в качестве примера многоточия.
...
Рейтинг: 0 / 0
30.07.2018, 15:47
    #39681149
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
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
30.07.2018, 16:11
    #39681159
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
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
30.07.2018, 18:56
    #39681265
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT
Выглядит довольно монстрообразно.
Неужели внешний джойн настолько "тяжел", что агрегатная функция в подобной конструкции (case внутри max) все равно эффективнее?
Я поверю на слово, но все равно странно, что для реляционной базы данных, суть которой в связях, лишний джойн это настолько "дорогая" операция.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DISTINCT / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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