powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
54 сообщений из 54, показаны все 3 страниц
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006220
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В легаси системе достался код, который местами меня сбивает с толку.
Про order by 1 и т.д. я всегда знал, что так можно задать номер колонки.
У меня в коде я встретил order by, в который подставляется строка '0' либо '1', в зависимости от значения, возвращаемого instr, и у меня не получилось найти, что это означает.
Или это просто кривоватый код, который не ломается?
Что такое в запросе ORDER BY '0' или ORDER BY '1'???

select *
from table1 t1, table2 t2, table3 t3, table4 t4
where t1.id=a2.id and a1.acc=a3.id(+)
and t1.name = P_NAME
and t4.state = t2.status
order by DECODE(INSTR(P_TEXT,'~'||a3.VID||'~'),null,0,0,0,1) desc
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006224
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995,

В конкретно этом запросе - числовые значения для возврата первыми строк в тексте которых есть искомое значение.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006228
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995у меня не получилось найти, что это означает.

Сортировка по выражению. Ничем не отличатся от, например, "order by x + y * 2".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006231
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой код понятен?
Что произойдёт при выполнении?
Что будет, если из SELECT убрать строку CASE WHEN ID > 100 THEN 1 ELSE 0 END (но не убирать из ORDER BY)?

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
  ID,
  NAME,
  CASE WHEN ID > 100 THEN 1 ELSE 0 END AS ID_STATE
FROM Table
ORDER BY CASE WHEN ID > 100 THEN 1 ELSE 0 END
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006234
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
clipper1995,

В конкретно этом запросе - числовые значения для возврата первыми строк в тексте которых есть искомое значение.


а в каком поле?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006235
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
clipper1995
env
clipper1995,

В конкретно этом запросе - числовые значения для возврата первыми строк в тексте которых есть искомое значение.


а в каком поле? Выражение decode ... в запросе выдаст наружу либо '0' либо '1'
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006236
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
    *
from 
    table1 t1, 
    table2 t2, 
    table3 t3, 
    table4 t4
where 
    t1.id=a2.id and a1.acc=a3.id(+)
    and t1.name = P_NAME
    and t4.state = t2.status
order by 
    DECODE(INSTR(P_TEXT,'~'||a3.VID||'~'),null,0,0,0,1) desc 
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006237
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006239
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995
Выражение decode ... в запросе выдаст наружу либо '0' либо '1'

Выдаст числовое значение 1 или 0 в зависимости от результата instr. Не надо путать с позиционной нотацией.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006247
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

То есть даже если колонка запрятана внутрь функций, то ORDER BY все равно её увидит?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006248
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
rom 
    table1 t1, 
    table2 t2, 
    table3 t3, 
    table4 t4
where 
    t1.id=a2.id and a1.acc=a3.id(+)
    and t1.name = P_NAME



Пожалуй, я не прав. Этот запрос просто не будет работать
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006254
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995
ORDER BY все равно её увидит?


Вы упорно путаете позиционную нотацию, задаваемую парсеру в тексте запроса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
    select 1 id, 1 n from dual union all
    select 2 id, 3 n from dual union all
    select 3 id, 7 n from dual
)
select
    *
from 
    t
order by 
    1 desc;


и сортировку по вычисляемому значению выражения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
    select 1 id, 1 n from dual union all
    select 2 id, 3 n from dual union all
    select 3 id, 7 n from dual
)
select
    *
from 
    t
order by 
    case when mod(n,3) = 0 then 1 else 0 end desc;
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006257
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Спасибо, понятно.

Просто я ошибочно полагал, что сначала вычисляется DECODE, потом результат 0 или 1 'подставляется' в ORDER BY
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006274
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
clipper1995

Просто я ошибочно полагал, что сначала вычисляется DECODE, потом результат 0 или 1 'подставляется' в ORDER BY


Полезное замечание.

Order by 1, order by val - параметры - названия колонок

Order by 3/3, order by lower('Val') - параметры - выражения

Я недавно читал рекомендации избегать использование order by 1.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006281
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLOrder by 1, order by val - параметры - названия колонок

Нет, во втором случае это тоже выражение, возвращающее значение колонки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006288
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Нет, во втором случае это тоже выражение, возвращающее значение колонки.


Да и в первом случае это порядковый номер выражения в SELECT-е.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006290
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

во втором случае это тоже выражение, возвращающее значение колонки.

не факт




Тут 3 варианта:
expr
position
c_alias

к сожалению, я не очень понимаю, по каким критериам Oracle "последовательность буковок и циферек" которые встретились после ORDER BY относит к одному из трех (((

"c_alias
Specify an alias for the column expression. Oracle Database will use this alias in the column heading of the result set. The AS keyword is optional. The alias effectively renames the select list item for the duration of the query. The alias can be used in the order_by_clause but not other clauses in the query"
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006298
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLOrder by 1, order by val - параметры - названия колонок

Нет, во втором случае это тоже выражение, возвращающее значение колонки.


Ёклмн! Вы только что вырвали с корнем росток моей надежды что в этой области все просто и логично.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006300
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Dimitry Sibiryakov

пропущено...

Нет, во втором случае это тоже выражение, возвращающее значение колонки.


Ёклмн! Вы только что вырвали с корнем росток моей надежды что в этой области все просто и логично.


Э нет, подождите.

Код: plsql
1.
2.
3.
4.
5.
with tst(n,s) as (select 1, 'One' from dual union all
                  select 2, 'Two' from dual union all
                  select 3, 'Tri' from dual)
select * from tst
order by 6/3



не сортирует вторую колонку, а "order by 2" - сортирует.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006302
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Код: plsql
1.
2.
3.
4.
5.
SELECT
  ID AS SUPER_ID,
  NAME
FROM TABLE
ORDER BY SUPER_ID + 1
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006310
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev

Тут 3 варианта:
expr
position
c_alias

к сожалению, я не очень понимаю, по каким критериам Oracle "последовательность буковок и циферек" которые встретились после ORDER BY относит к одному из трех (((

"c_alias
Specify an alias for the column expression. Oracle Database will use this alias in the column heading of the result set. The AS keyword is optional. The alias effectively renames the select list item for the duration of the query. The alias can be used in the order_by_clause but not other clauses in the query"


Я не могу полагаться на интуитивное понимание, ввиду скромного опыта, но мои эксперименты говорят о следующем:
позиция - в формате неотрицательной константы типа NUMBER (3.14 можно, 2f нельзя). Дает ошибку если =0 или больше числа колонок. По смыслу не пересекается с выражением, т.к. сортировка по константе не полезна.

алиас - имя колонки запроса, оно синтаксически отличается от выражения или константы, т.к. парсер его знает или оно так обозначено - см пример ниже

Все остальное считается выражением.


Код: plsql
1.
2.
3.
4.
5.
with tst(n,"1") as (select 1, 'One' from dual union all
                  select 2, 'Two' from dual union all
                  select 3, 'Tri' from dual)
select * from tst
order by "1" -- алиас второй колонки 



Я не разбирал, как обрабатываются конфликты имен, когда алиас совпадает с именем функции без параметров.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006311
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev


Тут 3 варианта:
expr
position
c_alias

к сожалению, я не очень понимаю, по каким критериам Oracle "последовательность буковок и циферек" которые встретились после ORDER BY относит к одному из трех (((



алиас, выражение - понятно
позиия - ето допустимый цифровой порядковый номер

в древних версиях, для некошерных селектов position отличная весчь
в плюсе для лентяев (для меня) тож неплохо смотрится, мне удобно

Код: 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.
29.
30.
31.
32.
33.
34.
35.
SQL> ed
Wrote file afiedt.buf

  1  select 0 s,dname name from dept d
  2  union all
  3  select 1 s,'-----'  from dual
  4  union all
  5  select 2 s,ename  from emp e
  6* order by s, name
SQL> /
order by s, name
            *
ERROR at line 6:
ORA-00904: "NAME": invalid identifier

SQL> ed
Wrote file afiedt.buf

  1  select 0 s,dname name from dept d
  2  union all
  3  select 1 s,'-----'  from dual
  4  union all
  5  select 2 s,ename  from emp e
  6* order by 1, 2
SQL> /

         S NAME
---------- --------------
         0 ACCOUNTING
         0 OPERATIONS
         0 RESEARCH
         0 SALES
         1 -----
         2 ADAMS
         2 ALLEN



даж жаль что для group by пока что не сделали по position / alias

.....
stax
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006313
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Не один же раз разбирали уже почему так.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006315
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL


Я не разбирал, как обрабатываются конфликты имен, когда алиас совпадает с именем функции без параметров.


На первый взгляд, конфликты с алиасами колонок разрешаются по правилу scope. Местное определение затеняет более широкое.

В целом, у параметров ORDER BY пока вижу логичное поведение, кроме возможно дробных позиций колонки.
"ORDER BY 1.999" сортирует первую колонку, насколько это будет продолжать работать, неизвестно.

Код: plsql
1.
2.
3.
4.
5.
with tst(n,"sysdate") as (select 1, 'One' from dual union all
                  select 2, 'Two' from dual union all
                  select 3, 'Tri' from dual)
select * from tst
order by sysdate
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006316
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Я не разбирал, как обрабатываются конфликты имен, когда алиас совпадает с именем функции без параметров

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 sysdate from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     sysdate desc
SQL> /
    select 1 id, 1 sysdate from dual union all
                   *
ERROR at line 2:
ORA-00923: FROM keyword not found where expected


SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 "sysdate" from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     sysdate desc
SQL> /

        ID    sysdate
---------- ----------
         1          1
         3          7
         2          3

SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 "sysdate" from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     t.sysdate desc
SQL> /
    t.sysdate desc
      *
ERROR at line 11:
ORA-01747: invalid user.table.column, table.column, or column specification


SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 "sysdate" from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     t."sysdate" desc
SQL> /

        ID    sysdate
---------- ----------
         3          7
         2          3
         1          1
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006320
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Stax,

Не один же раз разбирали уже почему так.


про group by?

я все-таки надеюсь что сделають по алиасу

......
stax
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006325
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax

даж жаль что для group by пока что не сделали по position / alias

.....
stax


stax, я думаю это запрещено по той же причине, что и group by "alias".

Почему запрещен груп по алиасу, я достоверно не знаю, думаю потому, что слишком легко зацепить агрегатную функцию.

select count(*) as c from all_tables
group by c
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006335
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно веселые конструкции придумать )))

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select *
from  (
  select 10, 5, 2 from dual union all
  select 101, 55, 1 from dual
  )
order by 2;

select *
from  (
  select 10, 5, 2 from dual union all
  select 101, 55, 1 from dual
  )
order by '2';

select *
from  (
  select 10, 5, 2 from dual union all
  select 101, 55, 1 from dual
  )
order by "2";
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006440
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,


Весело у вас!
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006459
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Почему запрещен груп по алиасу

Копать в сторону порядка выполнения элементов конструкции select и этапа на котором сформирован собственно select list. Оттуда вытекает сложность реализации подобной конструкции.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006463
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env

Копать в сторону

копать не собираюсь
имхо
перед group by "все" уже сформировано, осталось сгруппировать

большой разницы с order by не вижу

конечно надо чутку попотеть над реализацией


ps
в древних версиях group by вызывал сортировку
тоесть грубо ето order by + группировка

.....
stax
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006466
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

group by выполняется до формирования select list, а отдельные агрегаты могут быть посчитаны ещё на этапе извлечения данных
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006469
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Стас, ты не путаешь SORT/HASH GROUP BY случаем с сортировкой итогового курсора?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006472
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллеги, о чём топик?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006474
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Как пропатчить KDE под FreeBSD, разумеется. А изначально о недопонимании разницы между позиционной нотацией и числовым выражением в order by.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006477
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стас,

Вот здесь позиционная/алиасная нотация на какой уровень группировки должна распространяться и почему именно на него?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> with t as (
  2      select 1 id, 2 subid, 10 n from dual union all
  3      select 2 id, 2 subid, 20 n from dual union all
  4      select 3 id, 2 subid, 30 n from dual union all
  5      select 4 id, 4 subid, 40 n from dual union all
  6      select 6 id, 5 subid, 50 n from dual
  7  )
  8  select
  9      sum(count(t.id) + sum(t.n)) s
 10  from
 11      t
 12  group by
 13      t.subid;

         S
----------
       155
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006498
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Стас,

Вот здесь позиционная/алиасная нотация на какой уровень группировки должна распространяться и почему именно на него?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> with t as (
  2      select 1 id, 2 subid, 10 n from dual union all
  3      select 2 id, 2 subid, 20 n from dual union all
  4      select 3 id, 2 subid, 30 n from dual union all
  5      select 4 id, 4 subid, 40 n from dual union all
  6      select 6 id, 5 subid, 50 n from dual
  7  )
  8  select
  9      sum(count(t.id) + sum(t.n)) s
 10  from
 11      t
 12  group by
 13      t.subid;

         S
----------
       155


сдесь никак
нет выражения которое напрягает меня повторять в group by

но пример хороший
t.subid явно нет в селект листе

пример с алиасом
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
SQL> ed
Wrote file afiedt.buf

  1  select
  2    case
  3      when sal+nvl(comm,0)<1000 then 'Мизер'
  4      when sal+nvl(comm,0) between 1000 and 2499 then 'Мало'
  5      when sal+nvl(comm,0) between 2500 and 4999 then 'Ок'
  6      else 'Шефы'
  7      end g
  8    ,count (*)
  9   end from emp
 10*  group by g
SQL> /
 group by g
          *
ERROR at line 10:
ORA-00904: "G": invalid identifier


SQL> ed
Wrote file afiedt.buf

  1  select
  2    case
  3      when sal+nvl(comm,0)<1000 then 'Мизер'
  4      when sal+nvl(comm,0) between 1000 and 2499 then 'Мало'
  5      when sal+nvl(comm,0) between 2500 and 4999 then 'Ок'
  6      else 'Шефы'
  7      end g
  8    ,count (*)
  9   end from emp
 10   group by --g
 11    case
 12      when sal+nvl(comm,0)<1000 then 'Мизер'
 13      when sal+nvl(comm,0) between 1000 and 2499 then 'Мало'
 14      when sal+nvl(comm,0) between 2500 and 4999 then 'Ок'
 15      else 'Шефы'
 16*     end
SQL> /

G            END
----- ----------
Мизер          2
Шефы           1
Мало           6
Ок             5

SQL>



оно мне и не надо, но иногда доставало

.....
stax
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006504
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
коллеги, о чём топик?


о мечтах (пожеланиях) к оракле ком

+ поднять процент занятости на работе

.....
stax
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006625
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax

имхо
перед group by "все" уже сформировано, осталось сгруппировать

большой разницы с order by не вижу


> "все" уже сформировано -
кроме значения агрегатных функций (там они будут, иначе хватает distinct вместо group)
Если позволить ссылку по алиасу, можно легко создать круговую зависимость, и труднее написать текст ошибки.
"group by ссылается на алиас, содержащий агрегатные функции, не делайте этого"

select count(val) as cnt from tst group by cnt

Я на это ссылался, когда говорил "чтоб не зацепить агрегатную функцию".

Вот я только не уверен, ссылка в group by на любую агрегатную функцию создает круговую зависимость, или бывают случаи когда это можно?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006628
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
ссылка в group by на любую агрегатную функцию

Что этим хотели сказать-то?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006632
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование агрегатных функций в конструкции group by запрещено в явном виде и выдаст ошибку
--ORA-00934: групповая функция здесь не разрешена
поэтому о круговых зависимостях речи не идёт.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006720
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL

Вот я только не уверен, ссылка в group by на любую агрегатную функцию создает круговую зависимость, или бывают случаи когда это можно?


Похоже, что исключений нет; в 11.2 ошибка происходит на стадии лексического разбора:

select count(2*2) from dual where count(2*2) < 0 -- нельзя, хоть и тавтология

select count(2*2) from dual having count(2*2) < 0 -- можно
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006734
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Похоже, что исключений нет; в 11.2 ошибка происходит на стадии лексического разбора:

select count(2*2) from dual where count(2*2) < 0 -- нельзя, хоть и тавтология

select count(2*2) from dual having count(2*2) < 0 -- можно

Что ты хотел продемонстрировать этим примером? И что ты ожидал, что ошибки не будет?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006746
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
Похоже, что исключений нет; в 11.2 ошибка происходит на стадии лексического разбора:

select count(2*2) from dual where count(2*2) < 0 -- нельзя, хоть и тавтология

select count(2*2) from dual having count(2*2) < 0 -- можно

Что ты хотел продемонстрировать этим примером? И что ты ожидал, что ошибки не будет?


Я хотел посмотреть, как мой Оракл 11.2 обрабатывает подобные выражения:
1) лексически (отказывается принимать агрегатные функции в неположеном месте)
или
2) логически (обнаруживает круговую логику в процессе построения плана)

Из пары примеров что я попробовал, это скорее первое чем второе.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006759
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

Где ты увидел круговую логику в приведенном тобой примере?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006765
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL,

Где ты увидел круговую логику в приведенном тобой примере?


В приведенном мной примере намеренно отсутствует круговая логика,
поэтому я его и выбрал для проверки своей гипотезы.

Если бы я использовал пример с круговой логикой, например

select count(val) from table group by count(val),

то это бы не ответило на мой вопрос.

Если вы читали по диагонали или были заняты и потеряли нить рассуждения, она довольно простая:

1. Вопрос был: есть ли исключения, когда использование агрегатных функций разрешено в GROUP BY?

2. Для поиска исключений я ограничился выражениями которые не содержат круговую логику (т.е вычисляемы).

3. Из десятка разных очевидно вычисляемых выражений, все были отвергнуты Ораклом 11.2

4. Я сделал вывод что оракл запрещает такие выражения на основании лексики, а не проблем с обработкой.

5. Рассказал про свое умозаключение

6. получил вопрос от вас, где круговая логика в моем примере.

7. сейчас обращаю ваше внимание на п.2 как ответ, и пп 1-4 для контекста.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006767
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Если вы читали по диагонали

Если бы ты читал документацию и книги не по диагонали, мы бы не созерцали этот поток бреда.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006829
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Настоятельно рекомендую найти и почитать в каком порядке выполняются элементы конструкции select. Высвободит много вашего времени на решение реальных задач.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40007113
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL,

Настоятельно рекомендую найти и почитать в каком порядке выполняются элементы конструкции select. Высвободит много вашего времени на решение реальных задач.


> в каком порядке выполняются элементы конструкции select

Тут или неудачный выбор слов, или коренное непонимание декларативной природы SQL.
Если второе, то вам поможет книжка по теории множеств. Начните здесь: https://habr.com/ru/post/457312/
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40007118
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Тут или неудачный выбор слов, или коренное непонимание декларативной природы SQL.
Больше похоже на то, что у вас - функциональная неграмотность: можете читать, но не в состоянии понять.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40007166
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Вы можете поиграть в доктора и ставить диагнозы, но подождите вашей очереди, мой комментарий был не к вам.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40007168
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

Тебе бы с азов начать, например с расшифровки аббревиатуры SQL.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40007589
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Тут или неудачный выбор слов, или коренное непонимание декларативной природы SQL

Скорее ваше нежелание осознать, о чём идёт речь.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40128438
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
НеофитSQL
Почему запрещен груп по алиасу

Копать в сторону порядка выполнения элементов конструкции select и этапа на котором сформирован собственно select list. Оттуда вытекает сложность реализации подобной конструкции.
Возможно и есть некоторые сложности, но фундаментальных причин почему этого сделать нельзя я не вижу.
В других движках (например PG) отлично работает.
Код: sql
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.
postgres=# with t(x) as
postgres-# (
postgres(# select 'A1' from dual
postgres(# union all select 'A2' from dual
postgres(# union all select 'WWW' from dual
postgres(# )
postgres-# select count(*) c, length(x) l
postgres-# from t
postgres-# group by l;
 c | l
---+---
 1 | 3
 2 | 2
(2 rows)


postgres=# with t(x) as
postgres-# (
postgres(# select 'A1' from dual
postgres(# union all select 'A2' from dual
postgres(# union all select 'WWW' from dual
postgres(# )
postgres-# select count(*) c, length(x) l
postgres-# from t
postgres-# group by 2;
 c | l
---+---
 1 | 3
 2 | 2
(2 rows)



Если оставить в стороне группировку по алиасу/позиции в Оракле есть и другие странности.
Следующие запросы работают в PG вполне ожидаемо.
Код: sql
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
postgres=# with t as (select 1 x from dual)
postgres-# select x, count(*)
postgres-# from t;
ERROR:  column "t.x" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2: select x, count(*)
               ^
postgres=#
postgres=# with t as (select 1 x from dual union all select 0 from dual)
postgres-# select x, count(*)
postgres-# from t;
ERROR:  column "t.x" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2: select x, count(*)
               ^
postgres=#
postgres=# with t as (select 1 x from dual)
postgres-# select x, (select count(*) from dual) y, count(*)
postgres-# from t
postgres-# group by x;
 x | y | count
---+---+-------
 1 | 1 |     1
(1 row)


postgres=#
postgres=# with t as (select 1 x from dual)
postgres-# select (select count(*) from dual) y, count(*)
postgres-# from t;
 y | count
---+-------
 1 |     1
(1 row)


postgres=#
postgres=# with t as (select 1 x from dual)
postgres-# select (select count(*) from dual) y, count(*)
postgres-# from t
postgres-# group by 'hello';
ERROR:  non-integer constant in GROUP BY
LINE 4: group by 'hello';

А что же будет в Оракл?
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SQL> with t as (select 1 x from dual)
  2  select x, count(*)
  3  from t;

         X   COUNT(*)
---------- ----------
         1          1

SQL>
SQL> with t as (select 1 x from dual union all select 0 from dual)
  2  select x, count(*)
  3  from t;
select x, count(*)
       *
ERROR at line 2:
ORA-00937: not a single-group group function


SQL>
SQL> with t as (select 1 x from dual)
  2  select x, (select count(*) from dual) y, count(*)
  3  from t
  4  group by x;

         X          Y   COUNT(*)
---------- ---------- ----------
         1          1          1

SQL>
SQL> with t as (select 1 x from dual)
  2  select (select count(*) from dual) y, count(*)
  3  from t;
select (select count(*) from dual) y, count(*)
               *
ERROR at line 2:
ORA-00937: not a single-group group function


SQL>
SQL> with t as (select 1 x from dual)
  2  select (select count(*) from dual) y, count(*)
  3  from t
  4  group by 'hello';

         Y   COUNT(*)
---------- ----------
         1          1

...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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