powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про distinct (опять)
25 сообщений из 26, страница 1 из 2
Вопрос про distinct (опять)
    #32123376
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею задачу убрать повторы по нескольким полям. Почитал про проблему\r
/topic/17322\r
не понял, как в результат вывести все поля таблицы и чем запрос \r
select * from ( select distinct object_type,owner from dba_objects )\r
отличается от \r
select distinct object_type,owner from dba_objects?
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123392
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, что ничем.
dba_objects - это вью. Как известно запрос из вью имеет свои особенности.
В некоторых случаях оптимизатор преобразует исходный запрос ко вью - в непосредственный запрос к исходным таблицам или вью этого вью.
Но он может это слелать не всегда, есть определённые ограничения.
Твой же запрос:select * from ( select distinct object_type,owner from dba_objects ) удовлетворяет этим ограничениям - поэтому оптимизатор преобразует этот запрос к select distinct object_type,owner from dba_objects.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123394
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И непонятно, какая в /topic/17322 собственно проблема?
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123511
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня задача выбрать все поля в таблице с дублированием значений данных по нескольким полям.
select distinct * from table убирает полностью повторяющиеся записи, а мне надо убрать повторы по нескольким полям с выводом всей таблицы
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123549
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял, нужен не вывод всей таблицы, а вывод всей строки.
Только вопрос: если убираются повторы не по всем атрибутам, то какой критерий выбора оставшихся?
Код: plaintext
1.
 1   1   3 
 1   1   4 

Какую строку выдать в результирующую выборку?
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123645
Artfil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну мне больше нравиться
1 1 4 ;))
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123753
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот дурацкое решение, которое сразу приходит в голову, которое мне самому не нравиться. Может есть проще.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select
(select object_type from dba_objects where object_type = a.object_type and owner = a.owner and rownum< 2 ) object_type,
(select owner from dba_objects where object_type = a.object_type and owner = a.owner and rownum< 2 ) owner,
(select object_name from dba_objects where object_type = a.object_type and owner = a.owner and rownum< 2 ) object_name
from
(
select 
object_type,owner
from 
dba_objects
 group by
  object_type,owner
) a
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123769
Chira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT DISTINCT object_type,owner,MAX(object_id)
FROM ALL_OBJECTS
GROUP BY object_type,owner
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123774
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>SELECT DISTINCT object_type,owner,MAX(object_id)
>FROM ALL_OBJECTS
>GROUP BY object_type,owner

а зачем DISTINCT?
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123798
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Chira: этот запрос проще, если нужно только одно поле вытащить, кроме тех которые участвуют в group by или distinct. А если нужно еще одно поле?
Например:
a b c d e f g
--------------
1 1 1 1 3 2 7
1 1 1 2 1 5 6
1 1 1 3 2 4 5

Допустим group идут по первым двум полям group by a,b - нужно вывести все остальные тоже.
select
a,b, max(c), max(d), max(e), max(f), max(g)
from
table
group by
a,b

Получим строку:
1 1 1 3 3 4 7

Однако должна получится строка:
1 1 1 1 3 2 7
или
1 1 1 2 1 5 6
или
1 1 1 3 2 4 5

т.е любая одна из трёх.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123803
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон не
"Получим строку:
1 1 1 3 3 4 7 "

а

1 1 1 3 3 5 7
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123817
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrew S. Задал выше дельный вопрос. "Какой критерий выбора оставшихся?"
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123821
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ладно мудрить-то, это уже на уровне дополнительных условий.
Напиши запрос, что-бы хотя бы любую строку вернуть.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123835
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To SoftBuilder.

Из той же песни, что и у тебя, только чуть проще.
SELECT DISTINCT object_type, owner,
(select object_name
FROM dba_objects b
WHERE a.object_type=b.object_type
AND a.owner=b.owner AND ROWNUM=1) object_name
FROM dba_objects a
GROUP BY object_type, owner
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123845
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to V.Pupkin: мне кажется вы плохо знаете SQL.
Если используется group by и ты хочешь в списке полей использовать поля кроме тех которые в group by - нужно использовать групповую функцию.

Ты хоть сам проверял свой запрос-то
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123861
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To SoftBuilder.
В 8.1.7 действительно был такой касяк, В 9i запрос в списке выборки не требует включения в фразу group by. В любом случае в 8i можно сделать так

SELECT distinct object_type, owner,
(select object_name FROM dba_objects b WHERE a.object_type=b.object_type AND a.owner=b.owner AND ROWNUM=1)
FROM dba_objects a

а в 9 ещё и сяк

SELECT object_type, owner,
(select object_name FROM dba_objects b WHERE a.object_type=b.object_type AND a.owner=b.owner AND ROWNUM=1)
FROM dba_objects a
GROUP BY object_type, owner
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123866
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Частный случай для двух атрибутов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table t4( n1 int, n2 int, n3 int, n4 int);

insert into t4 values( 1 , 1 , 3 , 4 );
insert into t4 values( 1 , 1 , 4 , 5 );
insert into t4 values( 2 , 2 , 5 , 6 );
insert into t4 values( 2 , 2 , 6 , 7 );
insert into t4 values( 2 , 2 , 2 , 7 );
insert into t4 values( 2 , 2 , 2 , 8 );

select *
  from
  (  select t.*, row_number() over(partition by n1 order by n2) rn
       from t4 t
  )
 where rn =  1 
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123898
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"В 8.1.7 действительно был такой касяк, В 9i запрос в списке выборки не требует включения в фразу group by. В любом случае в 8i можно сделать так"

Замечу что это не касяк, а спецификация SQL.
А насчёт 9i - спорить не буду - еще и не ставил и не верю, что такое сделали.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123919
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый SoftBuilder. Запрос в списке выборки (между SELECT и FROM) должен всегда возвращать только 1 строку, иначе вылетает исключение. Вопрос: зачем выполнять групповую операцию по константе? То же самое, что делать

select sysdate, count(*)
from dba_objects
group by sysdate

Со спецификацией SQL тут полная состыковка.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123926
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый SoftBuilder. Запрос в списке выборки (между SELECT и FROM) должен всегда возвращать только 1 строку, иначе вылетает исключение. Вопрос: зачем выполнять групповую операцию по константе? То же самое, что делать

select sysdate, count(*)
from dba_objects
group by sysdate

Со спецификацией SQL тут полная состыковка. Но мы кажется ушли от основной темы разговора, а AdrewS между тем предложил классное решение с Window Function...
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123931
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123939
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select sysdate, count(*)
from dba_objects
group by sysdate

Непонимаю что вы пытаетесь доказать эти примером.
Пример полностью соответствует спецификации SQL. И тому правилу про которое я говорил выше: в список после select можно поместить столбцы из group by и групповые функции.
И это возможно только по этой причине, а не потомучто sysdate - это константа.
Вы несёте какую-то отсебятину.
Тем более что sysdate - это не константа, а функция которая возвращает текущую дату, которая каждую секунду возвращает разные значения.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32123978
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какая ещё отсебятина? Вот выдержка из документации Оракла.

If a SELECT statement contains the GROUP BY clause, the select list can contain only the following types of expressions:

constants
group functions
the functions USER, UID, and SYSDATE
expressions identical to those in the GROUP BY clause
expressions involving the above expressions that evaluate to the same value for all rows in a group

Да и просто проверь. Как говориться, не можешь думать - работай руками.

select sysdate, count(*)
from user_objects

должно работать на всех близлижайших версиях.
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32124001
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю, что ты хочешь сказать, но ты путаешь разные вещи.
Значит еще раз обьясняю.
Этот запрос работает правильно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select sysdate, count(*) 
from dba_objects 
group by sysdate; 

SQLWKS> select sysdate, count(*) 
      2 > from dba_objects 
      3 > group by sysdate 
      4 > 
SYSDATE              COUNT(*)  
 -------------------- ----------
 
 20 . 03 . 03                     5355 
Выбрана  1  строка.



потому что sysdate есть во фразе group by. В этом случае идёт группирование ао sysdate, поэтому возвращается всего одна строка.

А в этом запросе возможно использование sysdate, потому-что это соответствует томучто, sysdate можно использовать в запросе:
Код: plaintext
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.
29.
30.
select object_type, count(*), sysdate
from dba_objects 
group by object_type;

SQLWKS> select object_type, count(*), sysdate
      2 > from dba_objects 
      3 > group by object_type
      4 > 
OBJECT_TYPE        COUNT(*)   SYSDATE             
 ------------------ ---------- --------------------
 
CLUSTER                      9   20 . 03 . 03             
CONSUMER GROUP               4   20 . 03 . 03             
DATABASE LINK                3   20 . 03 . 03             
FUNCTION                    41   20 . 03 . 03             
INDEX                      618   20 . 03 . 03             
LIBRARY                     22   20 . 03 . 03             
LOB                         22   20 . 03 . 03             
PACKAGE                    356   20 . 03 . 03             
PACKAGE BODY               350   20 . 03 . 03             
PROCEDURE                   70   20 . 03 . 03             
QUEUE                        4   20 . 03 . 03             
RESOURCE PLAN                1   20 . 03 . 03             
SEQUENCE                    77   20 . 03 . 03             
SYNONYM                   1356   20 . 03 . 03             
TABLE                      492   20 . 03 . 03             
TRIGGER                     13   20 . 03 . 03             
TYPE                        95   20 . 03 . 03             
VIEW                      1822   20 . 03 . 03             
Выбрано  18  строк.


В этом случае значение sysdate просто выводится.
Твой-же запрос не работает в 8i и не будет работать. А про 9i тебе уже сказал - здесь я спорить не буду.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQLWKS> SELECT object_type, owner, 
      2 > (select object_name FROM dba_objects b WHERE a.object_type=b.object_type AND a.owner=b.owner AND ROWNUM= 1 ) 
      3 > FROM dba_objects a 
      4 > GROUP BY object_type, owner
      5 > 
(select object_name FROM dba_objects b WHERE a.object_type=b.object_type AND a.owner=b.owner AND ROWNUM= 1 ) 
        *
ORA- 00979 : выражение не является выражением GROUP BY
...
Рейтинг: 0 / 0
Вопрос про distinct (опять)
    #32124054
V.Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давай разберемся спокойно без личных выпадов типа "мне кажется вы плохо знаете SQL" и "вы несёте какую-то отсебятину". В споре, как известно, рождается истина. Согласись, что группирование по константе, SYSDATE, UID, etc никакого смысла не имеет, т.к. все значения в полях с этими стобцами будут одними и теми же - группа одна. В случае с SYSDATE, хотя это не константа, как в начале запроса, так и в конце будет одно и то же значение, сколь долго этот запрос не работал. Группировать абсурдно. Теперь подходим к select (select...) ... . Смотрим (всё нижесказанное касается 9i)

SELECT object_type, owner,
(select object_name FROM dba_objects b WHERE a.object_type=b.object_type AND a.owner=b.owner AND ROWNUM=1)
FROM dba_objects a
GROUP BY object_type, owner

и видим, что вложенный запрос для одних и тех же OBJECT_TYPE и OBJECT_NAME во внешнем будет возвращать одно и то же значение. Гарантия. Зачем тогда совать его d GROUP BY? Не надо. Та же константа. А вот если бы я написал

SELECT object_type, owner,
(select object_name FROM dba_objects b WHERE a.object_type=b.object_type AND a.owner=b.owner AND ROWNUM=1 AND a.object_name=b.object_name)
FROM dba_objects a
GROUP BY object_type, owner

то я бы получил ORA-22818, потому что надо включить в GROUP BY ещё и object_name (вставлять подзапросы в group by пока низя)

Что касается 8.1.7, то эта тема в своё время проталкивалась на MetaLink и Oracle объявил поведение, подобное тому что получается у тебя, как "ошибочное отсутствие функциональности" (вольный перевод). Ну как? Взаимопонимание достигнуто? Или будем дальше спорить?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про distinct (опять)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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