Оракловые чудеса

User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

ALV00 wrote: 02 May 2019 17:45 Чтобы не плодить топики
Еще одна загадка от Ларри:
Почему из пустого множества получается такой результат?
Вы, гражданин, забыли написать GROUP BY C1 в конце.

Как написано, Ваш запрос аналогичен

Code: Select all

SELECT 123 AS c1, SUM (10) c2
  FROM DUAL
 WHERE 1 = 2
и результат вполне ожидаемый. С1 константа + аггрегат пустого множества (null).

Если добавить GROUP BY C1 но возращается 0 записей, как и хотелось Вам.
User avatar
liamkin
Уже с Приветом
Posts: 2643
Joined: 19 Jun 2003 20:22
Location: USA

Re: Оракловые чудеса

Post by liamkin »

там же в Оракле надо какую-то Оптимайзерную статистику пересчитывать регулярно - две простые но иногда долго выполняющиеся команды. Плюс включите затем AWR - он вам все скажет.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by KVA »

А почему это вообще выполняется? Вроде как синтаксис неверен и вообще не должно выполнятся. MS SQL ругается например
----
Incorrect syntax near ')'.

А на что-то такое уже совсем конкретную ошибку дает.
----
Column 't.c1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Code: Select all

select t.c1, sum(t.c2)
from (
    select 123 as c1, 10 as c2
    from Contacts
    where 1=2
) t
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

KVA wrote: 02 May 2019 18:24 А почему это вообще выполняется? Вроде как синтаксис неверен и вообще не должно выполнятся. MS SQL ругается например
Почему неверен? Неужели Вас смущают запросы типа

Code: Select all

SELECT 'Дятлы' label, COUNT (1) cnt
  FROM birds
 WHERE family = 'Woodpecker'
UNION ALL
SELECT 'Вороны' label, COUNT (1) cnt
  FROM birds
 WHERE family = 'Crow'
Стандартное правило - аггрегационный запрос требует, чтобы все колонки по которым происходит группировака были в спике group by. В данном случае список группировки пустой, значит происходит аггрегация всех записей после наложения фильтра и к результату прилепляется константа. Запрос возвращает две записи (дятлы и вороны) + посчитаное количество отфильтрованых записей для каждого поздапроса.

Если взять реальную колонку из таблицы вместо константы "Дятлы", то получите сообщение об ошибке что отсутсвует GROUP BY по этой колонке.
Если добавить дятлов в group by, то в зависимости от наличия отфильтрованых записей получите либо количество, либо пустой ответ.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by KVA »

MS SQL изначальный SQL очень даже смущает.

Я как бы не очень эксперт в базах и изначальный SQL выглядит для меня на уровне

x = a++ + ++a + a++;

Что-то там получится. Может даже правильно, но писать так не стоит.
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Оракловые чудеса

Post by ALV00 »

Да, пропущено group by. Это из реального баг кейса. База - теоретически - должна ругаться на такое выражение. db2 ругается, MS SQL - как говорят - тоже ругается. Оракл почему-то нет и выдает странный результат. У Ларри все не как у людей.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by KVA »

Даже если Оракл позволяет пропустить group by странно что выдалась строка. Вот такой эквивалент в MS SQL server выдает пустой результат.

Code: Select all

select t.c1, sum(t.c2)
  from (
       select 123 as c1, 10 as c2
       from Contacts
      where 1=2
   ) t
   group by t.c1
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

KVA wrote: 03 May 2019 16:37 Даже если Оракл позволяет пропустить group by странно что выдалась строка. Вот такой эквивалент в MS SQL server выдает пустой результат.
Этот код тоже выдает 0 rows в оракле. Разница в том, что group by есть или нет в конце.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15526
Joined: 27 Sep 2007 22:53

Re: Оракловые чудеса

Post by Мальчик-Одуванчик »

Lazy444 wrote: 06 May 2019 20:02 Еще ни разу не встретил погроммиста, который бы признал, что он чего то не знает. Все "Билли виноват". Или Линус ( который Торвальд). Или Ларри :D
Что странно - даже Страуструп признавал что он очень многого не знает из придуманного им языка С++.
deev_a_v
Уже с Приветом
Posts: 4667
Joined: 07 Apr 2018 15:16

Re: Оракловые чудеса

Post by deev_a_v »

Lazy444 wrote: 06 May 2019 20:02 Еще ни разу не встретил погроммиста, который бы признал, что он чего то не знает. Все "Билли виноват". Или Линус ( который Торвальд). Или Ларри :D
Ага. Сколько я видел начинающих, которые с ходу находили баги в MS SQL Server :D
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15526
Joined: 27 Sep 2007 22:53

Re: Оракловые чудеса

Post by Мальчик-Одуванчик »

Lazy444 wrote: 06 May 2019 23:30
Мальчик-Одуванчик wrote: 06 May 2019 20:06
Lazy444 wrote: 06 May 2019 20:02 Еще ни разу не встретил погроммиста, который бы признал, что он чего то не знает. Все "Билли виноват". Или Линус ( который Торвальд). Или Ларри :D
Что странно - даже Страуструп признавал что он очень многого не знает из придуманного им языка С++.
Эффект Да́ннинга — Крю́гера — метакогнитивное искажение, которое заключается в том, что люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации[1]. Это приводит к возникновению у них завышенных представлений о собственных способностях, в то время как действительно высококвалифицированные люди, наоборот, склонны занижать оценку своих способностей и страдать недостаточной уверенностью в своих силах, считая других более компетентными. Таким образом, менее компетентные люди в целом имеют более высокое мнение о собственных способностях, чем это свойственно людям компетентным (которые к тому же склонны предполагать, что окружающие оценивают их способности так же низко, как и они сами). Также люди с высоким уровнем квалификации ошибочно полагают, что задачи, которые для них легки, также легки и для других людей
То есть, судя по приведенной ссылке, Вам встречались исключительно низкоквалифицированные программисты?
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Оракловые чудеса

Post by ALV00 »

Вот еще проблема: нужно тупо скинуть таблицу в CSV файл на локальном диске. Exp делает что-то неожиданно странное, вроде бэкапа, причем пишет в файл на сервере, куда у меня и доступа нет. В оракле походу нет готовой утилиты для такой элементарщины. Как ораклисты выкручиваются, пишут каждый раз программу что ли?
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Оракловые чудеса

Post by iDesperado »

ALV00 wrote: 30 May 2019 14:42 Вот еще проблема: нужно тупо скинуть таблицу в CSV файл на локальном диске. Exp делает что-то неожиданно странное, вроде бэкапа, причем пишет в файл на сервере, куда у меня и доступа нет. В оракле походу нет готовой утилиты для такой элементарщины. Как ораклисты выкручиваются, пишут каждый раз программу что ли?
любой ide сохраняет хоть в csv, хоть ёксель
User avatar
Helmsman
Уже с Приветом
Posts: 6450
Joined: 15 May 2003 00:04
Location: LA

Re: Оракловые чудеса

Post by Helmsman »

ALV00 wrote: 30 May 2019 14:42 Вот еще проблема: нужно тупо скинуть таблицу в CSV файл на локальном диске. Exp делает что-то неожиданно странное, вроде бэкапа, причем пишет в файл на сервере, куда у меня и доступа нет. В оракле походу нет готовой утилиты для такой элементарщины. Как ораклисты выкручиваются, пишут каждый раз программу что ли?
Утилита есть, sqlplus называется. Глушим заголовки и ставим запятую разделителем, потом просто select * from table со spool-ом. Но если к серверу доступа нет, то, как выше написали, любой ide - toad, sql developer, pl/sql developer.
exp тут не годится, у него свой формат.
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Оракловые чудеса

Post by ALV00 »

iDesperado wrote: 30 May 2019 15:46 любой ide сохраняет хоть в csv, хоть ёксель
Хотелось бы запускать из командной строки, для автоматизации.
Helmsman wrote: 30 May 2019 16:08 Утилита есть, sqlplus называется. Глушим заголовки и ставим запятую разделителем, потом просто select * from table со spool-ом. Но если к серверу доступа нет, то, как выше написали, любой ide - toad, sql developer, pl/sql developer.
exp тут не годится, у него свой формат.
Криво выходит, ой криво. Для печати кое-как годится, для обмена данными нет. Лезет всякая грязь, varchar выводятся fixed size с пробелами.
Unusable :sadcry:

Return to “Вопросы и новости IT”