powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / аналог for xml path
17 сообщений из 17, страница 1 из 1
аналог for xml path
    #38607922
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
В MSSQL есть отличная команда for xml path('') склеивания в одну строку значений попадающих под определенное условие

Например:
select '[ ' + x.Caption00 + ' ], ' from CD_ROM_DATA x where x.MachineID = t.MachineID for xml path('')

Есть ли в DB2 что-то похожее и если есть то что?
...
Рейтинг: 0 / 0
аналог for xml path
    #38607953
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULER,

Добрый день.

Код: plaintext
1.
2.
3.
4.
select tabschema,  listagg (tabname, ',') tabnames
from syscat.tables
where tabschema like 'SYS%'
group by tabschema
...
Рейтинг: 0 / 0
аналог for xml path
    #38608399
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Классно, спасибо. Вроде бы работает, но не до конца.

Есть запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select distinct vu.VOLUME_NAME,
                 v.PCT_UTILIZED,
                   listagg(vu.NODE_NAME, ', ') AS NN,
                vu.STGPOOL_NAME
              from volumeusage vu inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
          group by vu.VOLUME_NAME,
                    v.PCT_UTILIZED,
                   vu.NODE_NAME,
                   vu.STGPOOL_NAME
          order by vu.VOLUME_NAME



так вот он в listagg(vu.NODE_NAME, ', ') AS NN выводит строку, которая слеплена из значений, которые повторяются между собой.
А надо, чтобы строка была из уникальных значений (без повторений).

К примеру, вот этот MSSQL запрос работает верно:
Код: sql
1.
2.
3.
4.
5.
6.
select distinct vu.VOLUME_NAME,
       v.PCT_UTILIZED, 
         (select distinct nn.NODE_NAME + ', ' from VOLUMEUSAGE nn where vu.VOLUME_NAME = nn.VOLUME_NAME for xml path ('')) NODE_NAME,
      vu.STGPOOL_NAME
    from volumeusage vu inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
group by vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME, vu.STGPOOL_NAME order by vu.VOLUME_NAME    
...
Рейтинг: 0 / 0
аналог for xml path
    #38608500
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. я не могу внутри listagg отобрать уникальные значения. Он сцепляет в одну строку - то что есть, а мне нужно, чтобы в него попадали только уникальные значения.
...
Рейтинг: 0 / 0
аналог for xml path
    #38608528
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select distinct vu.VOLUME_NAME,
                 v.PCT_UTILIZED,
                   listagg(DISTINCT vu.NODE_NAME, ', ') AS NN,
                vu.STGPOOL_NAME
              from volumeusage vu inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
          group by vu.VOLUME_NAME,
                    v.PCT_UTILIZED,
                   vu.NODE_NAME,
                   vu.STGPOOL_NAME
          order by vu.VOLUME_NAME
...
Рейтинг: 0 / 0
аналог for xml path
    #38608536
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CawaSPb,

Вроде бы уже так пробовал. Но проверю! Отпишусь. Спасибо.
...
Рейтинг: 0 / 0
аналог for xml path
    #38608554
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULER,

Distinct как-то не убирает дубли.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select a.id, listagg(
distinct 
b.v, ',')
from 
  table(values 1, 2) a(id)
, 
--(select distinct id, v
--from 
table(values (1, 'a'), (1, 'a'), (1, 'b'), (2, 'b')) b(id, v)
--) b
where a.id=b.id
group by a.id


Вам надо убирать дубли во вложенном запросе, а потом отдавать listagg'у.
Раскомментируйте строки для сравнения.
...
Рейтинг: 0 / 0
аналог for xml path
    #38608609
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Да, я понимаю, что во "внешнем запросе" мне надо убирать дубли в vu.NODE_NAME, а уже потом, "скармливать" почищенную таблицу LISTAGG-у

Что я и сделал:

Код: sql
1.
2.
3.
4.
5.
6.
select distinct vu.VOLUME_NAME,
				 v.PCT_UTILIZED, 
				vu.NODE_NAME
		   from volumeusage vu
     inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
       group by vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME order by vu.VOLUME_NAME    



выведет, хоть и не склеенные строки (нет агрегации по vu.NODE_NAME) но дублей среди значений vu.NODE_NAME не будет.
Но стоит мне изменить в вышеупомянутом запросе одну строку vu.NODE_NAME на listagg(vu.NODE_NAME, ', ') AS NN как появляются дубли. Понять не могу чего я не вижу.
...
Рейтинг: 0 / 0
аналог for xml path
    #38608644
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULER,

Я не очень-то понимаю логику ваших таблиц и запроса, но почему вы агрегируете по vu.NODE_NAME?
Почему не так:

Код: plaintext
1.
2.
3.
4.
select distinct vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME
from volumeusage vu
inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
group by vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME 
order by vu.VOLUME_NAME
?
...
Рейтинг: 0 / 0
аналог for xml path
    #38609221
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Всё дело в склеивании строк. Человек (который попросил меня о помощи) хочет видеть запись в виде склеенной строки из значений разделенными запятыми. Поэтому и приходится прибегать к функции агрегации Listagg ((
...
Рейтинг: 0 / 0
аналог for xml path
    #38609534
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULER,

Вы можете на примере с данными показать, что вам надо?
Например, запрос:
Код: sql
1.
2.
3.
select vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME, vu.STGPOOL_NAME
from volumeusage vu 
inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME

возвращает такие-то данные.
А надо получить вот такие-то...
...
Рейтинг: 0 / 0
аналог for xml path
    #38609850
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Да, конечно.
Вот этот запрос:

Код: sql
1.
2.
3.
4.
5.
select distinct vu.VOLUME_NAME,
        v.PCT_UTILIZED, 
       vu.NODE_NAME
  from volumeusage vu inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
group by vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME order by vu.VOLUME_NAME    


Возвращает вот такие данные:

VOLUME_NAME PCT_UTILIZED NODE_NAME
BORLAND 131 NODE_2
BORLAND 131 NODE_3
BORLAND 131 NODE_5
Microsoft 123 NODE_1
Microsoft 123 NODE_2
Microsoft 123 NODE_3
Microsoft 123 NODE_5
Xerox 323 NODE_7
Xerox 323 NODE_8

А нужно, чтобы возвращал вот такие:
VOLUME_NAME PCT_UTILIZED NODE_NAME
BORLAND 131 NODE_2, NODE_3, NODE_5
Microsoft 123 NODE_1, NODE_2, NODE_3, NODE_5
Xerox 323 NODE_7, NODE_8
...
Рейтинг: 0 / 0
аналог for xml path
    #38609854
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за нечитаемый вид таблиц :(
Но данных не много, там в принципе понятно.
...
Рейтинг: 0 / 0
аналог for xml path
    #38609891
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос
Код: sql
1.
2.
3.
4.
5.
6.
select vu.VOLUME_NAME,
        v.PCT_UTILIZED, 
       vu.NODE_NAME,       
       vu.FILESPACE_NAME
  from volumeusage vu inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
group by vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME, vu.FILESPACE_NAME order by vu.VOLUME_NAME    



Возвращает вот такие данные:

VOLUME_NAME PCT_UTILIZED NODE_NAME FILESPACE_NAMEBORLAND 131 NODE_2 FSN2BORLAND 131 NODE_3 FSN3BORLAND 131 NODE_5 FSN4Microsoft 123 NODE_1 FSN1Microsoft 123 NODE_2 FSN1Microsoft 123 NODE_2 FSN2Microsoft 123 NODE_3 FSN1Microsoft 123 NODE_5 FSN1Xerox 323 NODE_7 FSN6Xerox 323 NODE_8 FSN1

Если применить функцию агрегации listagg и написать:
Код: sql
1.
2.
3.
4.
5.
6.
select vu.VOLUME_NAME,
           v.PCT_UTILIZED, 
              listagg(vu.NODE_NAME, ', ') AS NN,
         vu.FILESPACE_NAME
 from volumeusage vu inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
group by vu.VOLUME_NAME, v.PCT_UTILIZED, vu.FILESPACE_NAME order by vu.VOLUME_NAME    



то в результате, поле NN со строкой с Microsoft будет содержать NODE_1, NODE_2, NODE_2, NODE_3, NODE_5
А должна быть NODE_1, NODE_2, NODE_3, NODE_5 (т.е. с одним уникальным NODE_2)
...
Рейтинг: 0 / 0
аналог for xml path
    #38610013
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAULER,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select VOLUME_NAME, PCT_UTILIZED, listagg(NODE_NAME, ',') as NN, FILESPACE_NAME
from (
select distinct vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME, vu.FILESPACE_NAME
from volumeusage vu 
inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
)
group by VOLUME_NAME, PCT_UTILIZED, FILESPACE_NAME
order by VOLUME_NAME
...
Рейтинг: 0 / 0
аналог for xml path
    #38610047
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Прошу прощения, посмотрел на ваш последний запрос.
Там FILESPACE_NAME вообще не нужна (или я не понял, зачем вы привели для нее данные), т.е.:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select VOLUME_NAME, PCT_UTILIZED, listagg(NODE_NAME, ',') as NN
from (
select distinct vu.VOLUME_NAME, v.PCT_UTILIZED, vu.NODE_NAME
from volumeusage vu 
inner join volumes v on v.VOLUME_NAME = vu.VOLUME_NAME
)
group by VOLUME_NAME, PCT_UTILIZED
order by VOLUME_NAME
...
Рейтинг: 0 / 0
аналог for xml path
    #38610426
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein,

Да, всё верно. Не нужна. Это скорее уже вопрос корректности данных в таблицах.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / аналог for xml path
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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