|
|
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Имею задачу убрать повторы по нескольким полям. Почитал про проблему\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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 09:16 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Думаю, что ничем. dba_objects - это вью. Как известно запрос из вью имеет свои особенности. В некоторых случаях оптимизатор преобразует исходный запрос ко вью - в непосредственный запрос к исходным таблицам или вью этого вью. Но он может это слелать не всегда, есть определённые ограничения. Твой же запрос:select * from ( select distinct object_type,owner from dba_objects ) удовлетворяет этим ограничениям - поэтому оптимизатор преобразует этот запрос к select distinct object_type,owner from dba_objects. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 09:33 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
И непонятно, какая в /topic/17322 собственно проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 09:36 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
У меня задача выбрать все поля в таблице с дублированием значений данных по нескольким полям. select distinct * from table убирает полностью повторяющиеся записи, а мне надо убрать повторы по нескольким полям с выводом всей таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 11:09 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Насколько я понял, нужен не вывод всей таблицы, а вывод всей строки. Только вопрос: если убираются повторы не по всем атрибутам, то какой критерий выбора оставшихся? Код: plaintext 1. Какую строку выдать в результирующую выборку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 11:36 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Ну мне больше нравиться 1 1 4 ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 12:44 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Вот дурацкое решение, которое сразу приходит в голову, которое мне самому не нравиться. Может есть проще. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:04 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
SELECT DISTINCT object_type,owner,MAX(object_id) FROM ALL_OBJECTS GROUP BY object_type,owner ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:15 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
>SELECT DISTINCT object_type,owner,MAX(object_id) >FROM ALL_OBJECTS >GROUP BY object_type,owner а зачем DISTINCT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:17 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
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 т.е любая одна из трёх. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:29 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Пардон не "Получим строку: 1 1 1 3 3 4 7 " а 1 1 1 3 3 5 7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:31 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Andrew S. Задал выше дельный вопрос. "Какой критерий выбора оставшихся?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:39 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Да ладно мудрить-то, это уже на уровне дополнительных условий. Напиши запрос, что-бы хотя бы любую строку вернуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:42 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:52 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
to V.Pupkin: мне кажется вы плохо знаете SQL. Если используется group by и ты хочешь в списке полей использовать поля кроме тех которые в group by - нужно использовать групповую функцию. Ты хоть сам проверял свой запрос-то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 14:59 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:11 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Частный случай для двух атрибутов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:13 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
"В 8.1.7 действительно был такой касяк, В 9i запрос в списке выборки не требует включения в фразу group by. В любом случае в 8i можно сделать так" Замечу что это не касяк, а спецификация SQL. А насчёт 9i - спорить не буду - еще и не ставил и не верю, что такое сделали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:29 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Уважаемый SoftBuilder. Запрос в списке выборки (между SELECT и FROM) должен всегда возвращать только 1 строку, иначе вылетает исключение. Вопрос: зачем выполнять групповую операцию по константе? То же самое, что делать select sysdate, count(*) from dba_objects group by sysdate Со спецификацией SQL тут полная состыковка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:40 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Уважаемый SoftBuilder. Запрос в списке выборки (между SELECT и FROM) должен всегда возвращать только 1 строку, иначе вылетает исключение. Вопрос: зачем выполнять групповую операцию по константе? То же самое, что делать select sysdate, count(*) from dba_objects group by sysdate Со спецификацией SQL тут полная состыковка. Но мы кажется ушли от основной темы разговора, а AdrewS между тем предложил классное решение с Window Function... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:41 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
select sysdate, count(*) from dba_objects group by sysdate Непонимаю что вы пытаетесь доказать эти примером. Пример полностью соответствует спецификации SQL. И тому правилу про которое я говорил выше: в список после select можно поместить столбцы из group by и групповые функции. И это возможно только по этой причине, а не потомучто sysdate - это константа. Вы несёте какую-то отсебятину. Тем более что sysdate - это не константа, а функция которая возвращает текущую дату, которая каждую секунду возвращает разные значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:50 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Какая ещё отсебятина? Вот выдержка из документации Оракла. 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 должно работать на всех близлижайших версиях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 16:22 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Я понимаю, что ты хочешь сказать, но ты путаешь разные вещи. Значит еще раз обьясняю. Этот запрос работает правильно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. потому что 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. В этом случае значение sysdate просто выводится. Твой-же запрос не работает в 8i и не будет работать. А про 9i тебе уже сказал - здесь я спорить не буду. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 16:43 |
|
||
|
Вопрос про distinct (опять)
|
|||
|---|---|---|---|
|
#18+
Давай разберемся спокойно без личных выпадов типа "мне кажется вы плохо знаете 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 объявил поведение, подобное тому что получается у тебя, как "ошибочное отсутствие функциональности" (вольный перевод). Ну как? Взаимопонимание достигнуто? Или будем дальше спорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 17:21 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32123753&tid=1991389]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 502ms |

| 0 / 0 |
