Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Получение всех столбцов таблицы в виде одной строки.  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Господа, я понимаю, что кое-кому оно и даром не надо, но просто интересно: нужно получить имена столбцов какой-либо таблицы из n столбцов строкой вида '<название 1-го стобца>, <название 2-го стобца>, ..., <название n-го стобца>'. Есть вот такой вариант:

SELECT * FROM dba_objects;
SELECT LTRIM(sys_connect_by_path(column_name, ', '), ', ')
  FROM (SELECT column_name, LAG(column_name) OVER (ORDER BY COLUMN_ID) prev_name
             , MAX(column_id) OVER() max_level
          FROM dba_tab_columns cols, dba_objects objs
         WHERE cols.table_name = 'MY_TABLE' AND cols.owner = 'SCHEMA' 
           AND cols.table_name = objs.object_name
           AND cols.owner = objs.owner
           AND objs.object_type = 'TABLE')
 WHERE LEVEL = max_level
CONNECT BY PRIOR column_name = prev_name

У кого предложения по улучшению/ решения другого вида - буду весьма благодарен. :)
14 ноя 07, 22:34    [4918130]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Сорри, в коде случайно лишнюю строку захватил - "SELECT * FROM dba_objects;". Выполняется, конечно, второй запрос.
14 ноя 07, 23:11    [4918198]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116294
Начал разбираться с XML- агрегацией.
Вот получилось

select 
rtrim(sys_xmlagg(xmlelement(col, COLUMN_NAME||',')).extract('/ROWSET/COL/text()').getStringVal(),',') columns
from
(select * from user_tab_columns where table_name = 'EMP' order by column_id)
/
COLUMNS 
EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO 

Для упрощения я убрал связь с user_objects, но Вы правы -
это также нужно.
14 ноя 07, 23:17    [4918203]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
Elic
Member

Откуда:
Сообщений: 29990
suPPLer
У кого предложения по улучшению/ решения другого вида - буду весьма благодарен. :)
RTFM ТОП, SQL, PL/SQL: 5) Как получить все значения одного поля в одной строке, через разделители?
15 ноя 07, 08:42    [4918559]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
Ales Protiv
Member

Откуда: Прага
Сообщений: 1872
dmidek
Начал разбираться с XML- агрегацией.


дежавю :)

Вообще, лучше использовать обычный xmlagg - у него в девятке нет проблем с сортировкой.
(давно это было, потому могу что-то путать, но факт такой был)
15 ноя 07, 12:04    [4919793]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116294
Ales Protiv
dmidek
Начал разбираться с XML- агрегацией.


дежавю :)

Вообще, лучше использовать обычный xmlagg - у него в девятке нет проблем с сортировкой.
(давно это было, потому могу что-то путать, но факт такой был)


Почему дежавю ? Руководство к действию :-)
Ваш пример был у меня на экране ...
15 ноя 07, 12:06    [4919817]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
Ales Protiv
Member

Откуда: Прага
Сообщений: 1872
dmidek

Почему дежавю ? Руководство к действию :-)
Ваш пример был у меня на экране ...


Добавлю для коллекции вариацию на тему
select 
  table_name, 
  rtrim(xmlagg(xmlelement(a,column_name||',') order by column_name).extract('//A/text()'),',') cols 
from
  (select table_name, column_name from user_tab_columns)
group by table_name

Здесь явно задается сортировка конкатенируемого столбца, что есть гуд.
15 ноя 07, 12:43    [4920143]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
маленькая (какашка ) дёгтя
SQL> set lines 100
SQL> select owner,table_name,sum(length(column_name)+1)-1
  2    from all_tab_columns
  3    group by owner,table_name
  4    having sum(length(column_name)+1)-1>4000
  5    order by 3 desc;

OWNER                          TABLE_NAME                     SUM(LENGTH(COLUMN_NAME)+1)-1
------------------------------ ------------------------------ ----------------------------
APPS                           IGFFV_PROFILE_INFORMATION                             16978
APPS                           IGFBV_PROFILE_INFORMATION                             16875
IGF                            IGF_AP_LI_CSS_INTS                                    16714
APPS                           IGF_AP_CSS_INTERFACE                                  14302
IGF                            IGF_AP_CSS_INTERFACE_ALL                              14295
APPS                           AR_TAX_EXTRACT_ITF_V                                  14265
APPS                           HRIFG_PEREIT                                          13726
APPS                           JG_ZZ_TAXABLE_DETAIL_ITF_V                            11175
IGF                            IGF_AP_LI_ISIR_INTS                                   11057
APPS                           AMS_HZ_B2B_MAPPING_V                                  11049
APPS                           IGF_AP_ISIR_INTS                                      10882
...
APPS                           INVFG_ITEMS                                            4005
FEM                            FEM_MORTGAGES                                          4003

211 строк выбрано.
15 ноя 07, 13:49    [4920698]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
Ales Protiv
Member

Откуда: Прага
Сообщений: 1872
orawish
маленькая (какашка ) дёгтя


Ну без rtrim же можно обойтись ;)
15 ноя 07, 15:08    [4921197]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Ales Protiv
orawish
маленькая (какашка ) дёгтя


Ну без rtrim же можно обойтись ;)

ага.. клеить
decode(column_id,1,column_name,','||column_name)
15 ноя 07, 16:14    [4921727]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Огромное спасибо всем! Прошу прощения за возникающие дежавю у большинства ответивших, чесслово, ненароком вышло. :)
15 ноя 07, 16:23    [4921806]     Ответить | Цитировать Сообщить модератору
 Re: Получение всех столбцов таблицы в виде одной строки.  [new]
Evgeni8791
Guest
Ales Protiv
dmidek

Почему дежавю ? Руководство к действию :-)
Ваш пример был у меня на экране ...


Добавлю для коллекции вариацию на тему
select 
  table_name, 
  rtrim(xmlagg(xmlelement(a,column_name||',') order by column_name).extract('//A/text()'),',') cols 
from
  (select table_name, column_name from user_tab_columns)
group by table_name

Здесь явно задается сортировка конкатенируемого столбца, что есть гуд.


А повторяющиеся данные можно убрать из конкатенируемого столбца используя этот способ (distinct)?
10 дек 07, 15:51    [5027758]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить