powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Результат SELECT-а в одну строку
20 сообщений из 45, страница 2 из 2
Результат SELECT-а в одну строку
    #36855309
evs-ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А без сортировки такое можно сделать?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Результат SELECT-а в одну строку
    #38136015
Фотография Shredder2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так как топик в FAQе, добавлю:

начиная с версии 11.2 субд появилась прекрасная родная sql-функция, которая позволяет это делать LISTAGG :

Код: plsql
1.
2.
3.
4.
SELECT LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list",
    MIN(hire_date) "Earliest"
    FROM employees
    WHERE department_id = 30;
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136564
abtop_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
evs-ru,

LISTAGG ?
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136568
abtop_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shredder2003,

блин, не посмотрел на вторую страницу )
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136942
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shredder2003прекраснаяс одного боку прерасная. а с другого пресиняя - не поддерживет клоб и distinct
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136972
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Shredder2003прекраснаяс одного боку прерасная. а с другого пресиняя - не поддерживет клоб и distinctорацл любит такое :)

создаст новую прекрасную фишку со многими пресиними ограничениями
и потом пару версий выргебает

пример:
добавили в 8 версии connect by
и только в 9-ой order sibling
и только в ещё более старших sys_connect_by_root и nocycle
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136982
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-с одного боку прерасная. а с другого пресиняя - не поддерживет клоб и distinct

Да еще и ORDER BY требует, да и сортирует сволочь добавляя LISTAGG выражение к ORDER BY:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select listagg(ename,',') within group(order by 1)
  2  from emp;

LISTAGG(ENAME,',')WITHINGROUP(ORDERBY1)
--------------------------------------------------------------------------------------
ADAMS,ALLEN,BLAKE,CLARK,FORD,JAMES,JONES,KING,MARTIN,MILLER,SCOTT,SMITH,TURNER,WARD

SQL> select listagg(ename,',') within group(order by null)
  2  from emp;

LISTAGG(ENAME,',')WITHINGROUP(ORDERBYNULL)
--------------------------------------------------------------------------------------
ADAMS,ALLEN,BLAKE,CLARK,FORD,JAMES,JONES,KING,MARTIN,MILLER,SCOTT,SMITH,TURNER,WARD

SQL> select listagg(ename,',') within group(order by deptno)
  2  from emp;

LISTAGG(ENAME,',')WITHINGROUP(ORDERBYDEPTNO)
--------------------------------------------------------------------------------------
CLARK,KING,MILLER,ADAMS,FORD,JONES,SCOTT,SMITH,ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

SQL> 



SY.
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136985
zhal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYда и сортирует сволочь добавляя LISTAGG выражение к ORDER BY А вот это уже безобразие. Никто ж не просил )
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38136990
Археолог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxдобавили в 8 версии connect by
и только в 9-ой order sibling
и только в ещё более старших sys_connect_by_root и nocycleТы не в теме.
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38139089
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как этот listagg по скорости? Потому как в 9-ке в pl-SQL обычное склеивание в курсоре раза в два быстрее, чем UDAF
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38139141
andreymxА как этот listagg по скорости? Потому как в 9-ке в pl-SQL обычное склеивание в курсоре раза в два быстрее, чем UDAFЛишь бы побольше чего-нибудь понаписать, а пусть-бы-и-глупостей-лишь-бы-постов? Не стыдно?
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38139155
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
палеонтологandreymxА как этот listagg по скорости? Потому как в 9-ке в pl-SQL обычное склеивание в курсоре раза в два быстрее, чем UDAFЛишь бы побольше чего-нибудь понаписать, а пусть-бы-и-глупостей-лишь-бы-постов? Не стыдно?и чего ты предлагаешь мне стыдиться? Вопроса о производительности функции?
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38139180
andreymxи чего ты предлагаешь мне стыдиться?Абсолютным невладением вопросом версионнозависимости фич иерархических запросов.

А касательно listagg, какая тебе, нафиг, разница с твоей-то девяткой?
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38139199
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логопалеонт,

ну, тогда скажи, в какмх версиях появились sibling и sys_connect_by_root.
Буду рад просветиться
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38139215
andreymxну, тогда скажи, в какмх версиях появились sibling и sys_connect_by_root.
Буду рад просветитьсяНеужели в доке забанили?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Результат SELECT-а в одну строку
    #38975652
evgenius_b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plsql
1.
2.
3.
4.
5.
SELECT U.NAME USERNAME, RTRIM((XMLAGG(XMLELEMENT(e,G.NAME,',').EXTRACT('//text()')),',') GROUPNAME
FROM USERS U, RIGHTS R, GROUPS G
WHERE R.USER_ID=U.ID AND R.GROUP_ID=G.ID
GROUP BY U.NAME
/



For example:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> select  job,
  2          rtrim(xmlagg(xmlelement(e,ename,',').extract('//text()')),',') ename_list
  3    from  emp
  4    group by job
  5  /

JOB       ENAME_LIST
--------- ----------------------------------------
ANALYST   SCOTT,FORD
CLERK     SMITH,JAMES,ADAMS,MILLER
MANAGER   JONES,CLARK,BLAKE
PRESIDENT KING
SALESMAN  ALLEN,WARD,TURNER,MARTIN

SQL> 



SY.


Я дико извиняюсь, но
Код: plsql
1.
2.
3.
4.
select  job,
               rtrim(xmlagg(xmlelement(e,ename,',').extract('//text()')[color=green] order by ename[/color]),',') ename_list
               from  emp
               group by job


в случае, если хотим выводить значения по порядку следования. Правильно?
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #38975691
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgenius_b,

Уже давно существует еще пару-тройку других решений через XML (без XMLAGG), но тебе принципиально было зацепится за медленный XMLAGG, который на длинных строках легко падает с
Код: plsql
1.
ORA-22813: operand value exceeds system limits

и вообще может быть рассмотрен скорее как баловство даже для работы с XML.

evgenius_bЯ дико извиняюсьЭту тему у тебя хватило мозгов откопать а в доку заглянуть нет?

PS. После таких подъемов тем начинаешь поддерживать, что гробокопательство полностью запрещено на community.oracle.com.
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #39118476
arCHi_1887
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY
Код: plsql
1.
2.
3.
4.
5.
SELECT U.NAME USERNAME, RTRIM((XMLAGG(XMLELEMENT(e,G.NAME,',').EXTRACT('//text()')),',') GROUPNAME
FROM USERS U, RIGHTS R, GROUPS G
WHERE R.USER_ID=U.ID AND R.GROUP_ID=G.ID
GROUP BY U.NAME
/



SY.

Как для такого примера получить distinct g.name в результирующем списке?
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #39324944
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopУже давно существует еще пару-тройку других решений через XML (без XMLAGG), но тебе принципиально было зацепится за медленный XMLAGG, который на длинных строках легко падает с
Код: plsql
1.
ORA-22813: operand value exceeds system limits

Немного раскрою тему.

Если возникла необходимость клеить клобы и вместо UDAG хочется использовать collect + UDF для склейки элементов коллекции, то может возникнуть неожиданность
11.2.0.1, 12.1.0.2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or replace type clobs as table of clob
/

Type created.

select cast(collect(column_value) as clobs) x from table(clobs(to_clob('123'),to_clob('qwerty')));
select cast(collect(column_value) as clobs) x from table(clobs(to_clob('123'),to_clob('qwerty')))
            *
ERROR at line 1:
ORA-22814: attribute or element value is larger than specified in type


select cast(multiset(select column_value from table(clobs(to_clob('123'),to_clob('qwerty')))) as clobs) x from dual;

X
--------------------------------------------------------------------------------
CLOBS('123', 'qwerty')

С varchar2 а не клоб таких проблем не возникает.

Если клеить XMLAGG, то может перестать работать из-за лимитов
11.2.0.1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select length(xmlagg(xmlelement("tmp", vals)).extract('//tmp/text()').getclobval()) l
  from (select 'table_name' table_name,
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 1978, '1')) vals
          from dual
        connect by level <= 2)
 group by table_name;

         L
----------
     59956


12.1.0.2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select length(xmlagg(xmlelement("tmp", vals)).extract('//tmp/text()').getclobval()) l
  from (select 'table_name' table_name,
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 1978, '1')) vals
          from dual
        connect by level <= 2)
 group by table_name;
select length(xmlagg(xmlelement("tmp", vals)).extract('//tmp/text()').getclobval()) l
*
ERROR at line 1:
ORA-22813: operand value exceeds system limits

Теперь меняем имя тега (для 1977 и без этого все хорошо)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select length(xmlagg(xmlelement(x, vals)).extract('//X/text()').getclobval()) l
  from (select 'table_name' table_name,
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 4000, '1')) ||
               to_clob(lpad('1', 1978, '1')) vals
          from dual
        connect by level <= 2)
 group by table_name;

         L
----------
     59956


Если использовать xmlquery + string-join
11.2.0.1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select length(xmlquery('fn:string-join(//VAL, "")' passing xmltype(cursor(
                        select to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 4000, '1')) ||
                               to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 4000, '1')) ||
                               to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 4000, '1')) ||
                               to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 1978, '1')) val
                          from dual
                        connect by level <= 2)) returning content).getclobval()) l
  from dual;
select length(xmlquery('fn:string-join(//VAL, "")' passing xmltype(cursor(
*
ERROR at line 1:
ORA-01706: user function result value was too large


12.1.0.2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select length(xmlquery('fn:string-join(//VAL, "")' passing xmltype(cursor(
                        select to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 4000, '1')) ||
                               to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 4000, '1')) ||
                               to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 4000, '1')) ||
                               to_clob(lpad('1', 4000, '1')) || to_clob(lpad('1', 1978, '1')) val
                          from dual
                        connect by level <= 2)) returning content).getclobval()) l
  from dual;

         L
----------
     59956

В общем 1:1 по версиям.
...
Рейтинг: 0 / 0
Результат SELECT-а в одну строку
    #39324947
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЕсли клеить XMLAGG, то может перестать работать из-за лимитов
Не совсем.
Попробуйте убрать group by - это реально забавно.
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Результат SELECT-а в одну строку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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