Welcome to dbFreaks.com!
FAQFAQ    SearchSearch      ProfileProfile    Private MessagesPrivate Messages   Log inLog in

Another question XML Output

 
   Database Help (Home) -> DB2 RSS
Next:  Date conversion: SELECT goes well, WHERE fails.  
Author Message
brunoalsantos

External


Since: Aug 27, 2008
Posts: 6



(Msg. 1) Posted: Mon Jun 14, 2010 11:08 am
Post subject: Another question XML Output
Archived from groups: comp>databases>ibm-db2 (more info?)

Hi all,

DB2 V9.5 FP5.

In my XML query, I've a table multi valued like the following example:

[db2inst1@JULIANA-PIRES ~]$ db2 "select * from T"

ID MAC_ADDRESS
----------- -------------------------
1 00:12:13:14:15:16
1 00:22:23:24:25:26

2 record(s) selected.


Using this statement with XMLGROUP (db2 "select
XMLSERIALIZE(XMLGROUP(M.ID, M.HOSTNAME, T.MAC_ADDRESS OPTION ROOT
"desktop") AS CLOB (50M)) FROM M INNER JOIN T on (M.ID = T.ID)"), I've
got this result set ...

<DESKTOP>
<row>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
</row>
<row>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
</row>
</DESKTOP>


I need an output that looks the following:


<DESKTOP>
<row>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
</row>
</DESKTOP>

Can you any ideas?

Thanks in advance.

 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Tonkuma

External


Since: Jan 30, 2008
Posts: 76



(Msg. 2) Posted: Tue Jun 15, 2010 8:08 am
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Here is an example.
But, I wondered if there would be other shorter ways.

WITH
T( id , mac_address ) AS (
VALUES
( 1 , '00:12:13:14:15:16' )
, ( 1 , '00:22:23:24:25:26' )
, ( 2 , '00:32:33:34:35:36' )
)
, M( id , hostname ) AS (
VALUES
( 1 , 'MACHINE_ONE' )
, ( 2 , 'Machine Two' )
)
SELECT '<DESKTOP>' ||
XMLSERIALIZE(
XMLAGG(
XMLELEMENT(
NAME row
, XMLFOREST(id , hostname)
, mac_address
)
)
AS CLOB (50M)
)
|| '</DESKTOP>'
FROM (SELECT M.id , M.hostname
, XMLAGG( XMLFOREST(T.mac_address) ) AS mac_address
FROM M
INNER JOIN
T
ON M.ID = T.ID
GROUP BY
M.id , M.hostname
) s
;

The result of the query will look like the following:
<DESKTOP>
<ROW>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
</ROW>
<ROW>
<ID>2</ID>
<HOSTNAME>Machine Two</HOSTNAME>
<MAC_ADDRESS>00:32:33:34:35:36</MAC_ADDRESS>
</ROW>
</DESKTOP>

My some other trial queries produced extra tags or less tags than
showed above.

 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
brunoalsantos

External


Since: Aug 27, 2008
Posts: 6



(Msg. 3) Posted: Fri Jun 18, 2010 1:19 pm
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

On 15 jun, 12:08, Tonkuma wrote:
> Here is an example.
> But, I wondered if there would be other shorter ways.
>
> WITH
>   T( id , mac_address ) AS (
> VALUES
>   ( 1 , '00:12:13:14:15:16' )
> , ( 1 , '00:22:23:24:25:26' )
> , ( 2 , '00:32:33:34:35:36' )
> )
> , M( id , hostname ) AS (
> VALUES
>   ( 1 , 'MACHINE_ONE' )
> , ( 2 , 'Machine Two' )
> )
> SELECT '<DESKTOP>' ||
>        XMLSERIALIZE(
>           XMLAGG(
>              XMLELEMENT(
>                 NAME row
>               , XMLFOREST(id , hostname)
>               , mac_address
>              )
>           )
>           AS CLOB (50M)
>        )
>        || '</DESKTOP>'
>   FROM (SELECT M.id , M.hostname
>              , XMLAGG( XMLFOREST(T.mac_address) ) AS mac_address
>           FROM M
>           INNER JOIN
>                T
>            ON  M.ID = T.ID
>          GROUP BY
>                M.id , M.hostname
>        ) s
> ;
>
> The result of the query will look like the following:
> <DESKTOP>
>          <ROW>
>               <ID>1</ID>
>               <HOSTNAME>MACHINE_ONE</HOSTNAME>
>               <MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
>               <MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
>          </ROW>
>          <ROW>
>               <ID>2</ID>
>               <HOSTNAME>Machine Two</HOSTNAME>
>               <MAC_ADDRESS>00:32:33:34:35:36</MAC_ADDRESS>
>          </ROW>
> </DESKTOP>
>
> My some other trial queries produced extra tags or less tags than
> showed above.


Hi Tonkuma,

Thanks for the post.

I had to add a new column with multi valued values ... and the XML
Output created a cartesian product, like the following:

WITH
T( id , mac_address ) AS (
VALUES
( 1 , '00:12:13:14:15:16' ),
( 1 , '00:22:23:24:25:26' ),
( 2 , '00:32:33:34:35:36' )
)

, S ( id, sw_name) AS (
VALUES
(1, 'Automatos'),
(1, 'Adobe'),
(1, 'Office')
)

, M( id , hostname ) AS (
VALUES
( 1 , 'MACHINE_ONE' ),
( 2 , 'Machine Two' )
)


SELECT '<DESKTOP>' ||
XMLSERIALIZE(
XMLAGG(
XMLELEMENT(
NAME row,
XMLFOREST(id , hostname),
mac_address,
sw_name
)
)
AS CLOB (50M)
)
|| '</DESKTOP>'

FROM (SELECT M.id , M.hostname,
XMLAGG( XMLFOREST(T.mac_address) ) AS mac_address,
XMLAGG( XMLFOREST(S.sw_name) ) AS sw_name
FROM M
INNER JOIN T ON (M.ID = T.ID)
INNER JOIN S ON (M.ID = S.ID)
GROUP BY
M.id , M.hostname
) s
;

The result of the query will look like the following:

<DESKTOP>
<ROW>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
<SW_NAME>Automatos</SW_NAME>
<SW_NAME>Automatos</SW_NAME>
<SW_NAME>Adobe</SW_NAME>
<SW_NAME>Adobe</SW_NAME>
<SW_NAME>Office</SW_NAME>
<SW_NAME>Office</SW_NAME>
</ROW>
</DESKTOP>

Any ideas?
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Tonkuma

External


Since: Jan 30, 2008
Posts: 76



(Msg. 4) Posted: Fri Jun 18, 2010 3:10 pm
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Please try:

WITH
T( id , mac_address ) AS (
VALUES
( 1 , '00:12:13:14:15:16' )
, ( 1 , '00:22:23:24:25:26' )
, ( 2 , '00:32:33:34:35:36' )
)

, S ( id, sw_name ) AS (
VALUES
(1 , 'Automatos' )
, (1 , 'Adobe' )
, (1 , 'Office' )
)

, M( id , hostname ) AS (
VALUES
( 1 , 'MACHINE_ONE' )
, ( 2 , 'Machine Two' )
)

SELECT '<DESKTOP>' ||
XMLSERIALIZE(
XMLAGG(
XMLELEMENT(
NAME row
, XMLFOREST(id , hostname)
, mac_address
, sw_name
)
)
AS CLOB (50M)
)
|| '</DESKTOP>'
FROM (SELECT M.id , M.hostname
, XMLAGG( XMLFOREST(T.mac_address) ) AS mac_address
, XMLAGG( XMLFOREST(S.sw_name ) ) AS sw_name
FROM M
INNER JOIN
(SELECT id , mac_address
, ROW_NUMBER()
OVER(PARTITION BY id) AS rn
FROM T
) AS T
FULL OUTER JOIN
(SELECT id , sw_name
, ROW_NUMBER()
OVER(PARTITION BY id) AS rn
FROM S
) AS S
ON S.id = T.id
AND S.rn = T.rn
ON M.id = COALESCE(S.id , T.id)
GROUP BY
M.id , M.hostname
) s
;

For the part of FULL OUTER JOIN,
please see my example in this thread:
http://www.dbforums.com/db2/1657599-query-required.html

The result of the query will look like the following:

<DESKTOP>
<ROW>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
<SW_NAME>Automatos</SW_NAME>
<SW_NAME>Adobe</SW_NAME>
<SW_NAME>Office</SW_NAME>
</ROW>
<ROW>
<ID>2</ID>
<HOSTNAME>Machine Two</HOSTNAME>
<MAC_ADDRESS>00:32:33:34:35:36</MAC_ADDRESS>
</ROW>
</DESKTOP>
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Tonkuma

External


Since: Jan 30, 2008
Posts: 76



(Msg. 5) Posted: Sat Jun 19, 2010 8:11 am
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

This is shorter and may be easier to understand.

SELECT '<DESKTOP>' ||
XMLSERIALIZE(
XMLAGG(
XMLELEMENT(
NAME row
, XMLFOREST(id , hostname)
, mac_address
, sw_name
)
)
AS CLOB (50M)
)
|| '</DESKTOP>'
FROM M
LEFT OUTER JOIN
LATERAL
(SELECT XMLAGG( XMLFOREST(mac_address) ) AS mac_address
FROM T
WHERE T.id = M.id
) AS T
ON 0=0
LEFT OUTER JOIN
LATERAL
(SELECT XMLAGG( XMLFOREST(sw_name) ) AS sw_name
FROM S
WHERE S.id = M.id
) AS S
ON 0=0
;
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Tonkuma

External


Since: Jan 30, 2008
Posts: 76



(Msg. 6) Posted: Sat Jun 19, 2010 8:25 am
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

This is more short, but produced extra tags.

SELECT XMLSERIALIZE(
XMLGROUP(
id , hostname
, mac_addresses
, sw_names
OPTION ROOT "DESKTOP"
)
AS CLOB (50M)
)
FROM M
LEFT OUTER JOIN
LATERAL
(SELECT XMLAGG( XMLFOREST(T.mac_address) ) AS mac_addresses
FROM T
WHERE T.id = M.id
) AS T
ON 0=0
LEFT OUTER JOIN
LATERAL
(SELECT XMLAGG( XMLFOREST(S.sw_name) ) AS sw_names
FROM S
WHERE S.id = M.id
) AS S
ON 0=0
;

The result of the query looks like the following:
(Extra tags <MAC_ADDRESSES> and <SW_NAMES> are included.)

<DESKTOP>
<row>
<ID>1</ID>
<HOSTNAME>MACHINE_ONE</HOSTNAME>
<MAC_ADDRESSES>
<MAC_ADDRESS>00:12:13:14:15:16</MAC_ADDRESS>
<MAC_ADDRESS>00:22:23:24:25:26</MAC_ADDRESS>
</MAC_ADDRESSES>
<SW_NAMES>
<SW_NAME>Automatos</SW_NAME>
<SW_NAME>Adobe</SW_NAME>
<SW_NAME>Office</SW_NAME>
</SW_NAMES>
</row>
<row>
<ID>2</ID>
<HOSTNAME>Machine Two</HOSTNAME>
<MAC_ADDRESSES>
<MAC_ADDRESS>00:32:33:34:35:36</MAC_ADDRESS>
</MAC_ADDRESSES>
</row>
</DESKTOP>
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Tonkuma

External


Since: Jan 30, 2008
Posts: 76



(Msg. 7) Posted: Mon Jun 21, 2010 2:48 am
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

INNER JOIN with traditional syntax will be enough(OUTER JOIN will be
not neccessary).

SELECT '<DESKTOP>' ||
XMLSERIALIZE(
XMLAGG(
XMLELEMENT(
NAME row
, XMLFOREST(id , hostname)
, mac_address
, sw_name
)
)
AS CLOB (50M)
)
|| '</DESKTOP>'
FROM M
, LATERAL
(SELECT XMLAGG( XMLFOREST(mac_address) ) AS mac_address
FROM T
WHERE T.id = M.id
) AS T
, LATERAL
(SELECT XMLAGG( XMLFOREST(sw_name) ) AS sw_name
FROM S
WHERE S.id = M.id
) AS S
;

or, if extra tags were allowed:

SELECT XMLSERIALIZE(
XMLGROUP(
id , hostname
, mac_addresses
, sw_names
OPTION ROOT "DESKTOP"
)
AS CLOB (1M)
)
FROM M
, LATERAL
(SELECT XMLAGG( XMLFOREST(mac_address) ) AS mac_addresses
FROM T
WHERE T.id = M.id
) AS T
, LATERAL
(SELECT XMLAGG( XMLFOREST(sw_name) ) AS sw_names
FROM T
WHERE S.id = M.id
) AS S
;
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
brunoalsantos

External


Since: Aug 27, 2008
Posts: 6



(Msg. 8) Posted: Tue Jun 22, 2010 10:15 am
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

On 21 jun, 06:48, Tonkuma wrote:
> INNER JOIN with traditional syntax will be enough(OUTER JOIN will be
> not neccessary).
>
> SELECT '<DESKTOP>' ||
>        XMLSERIALIZE(
>           XMLAGG(
>              XMLELEMENT(
>                 NAME row
>               , XMLFOREST(id , hostname)
>               , mac_address
>               , sw_name
>              )
>           )
>           AS CLOB (50M)
>        )
>        || '</DESKTOP>'
>   FROM M
>      , LATERAL
>        (SELECT XMLAGG( XMLFOREST(mac_address) ) AS mac_address
>           FROM T
>          WHERE T.id = M.id
>        ) AS T
>      , LATERAL
>        (SELECT XMLAGG( XMLFOREST(sw_name) ) AS sw_name
>           FROM S
>          WHERE S.id = M.id
>        ) AS S
> ;
>
> or, if extra tags were allowed:
>
> SELECT XMLSERIALIZE(
>           XMLGROUP(
>              id , hostname
>            , mac_addresses
>            , sw_names
>              OPTION ROOT "DESKTOP"
>           )
>           AS CLOB (1M)
>        )
>   FROM M
>      , LATERAL
>        (SELECT XMLAGG( XMLFOREST(mac_address) ) AS mac_addresses
>           FROM T
>          WHERE T.id = M.id
>        ) AS T
>      , LATERAL
>        (SELECT XMLAGG( XMLFOREST(sw_name) ) AS sw_names
>           FROM T
>          WHERE S.id = M.id
>        ) AS S
> ;

Hi Tonkuma,

Now the output is perfect.
Thank you very much for the tips.

Bruno.
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Tonkuma

External


Since: Jan 30, 2008
Posts: 76



(Msg. 9) Posted: Tue Jun 22, 2010 6:43 pm
Post subject: Re: Another question XML Output [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

One supplement.

Because you are using DB2 V9.5,
you can use CROSS JOIN instead of tarditional comma syntax for join.

Like this:
SELECT '<DESKTOP>' ||
XMLSERIALIZE(
XMLAGG(
XMLELEMENT(
NAME row
, XMLFOREST(id , hostname)
, mac_address
, sw_name
)
)
AS CLOB (50M)
)
|| '</DESKTOP>'
FROM M
CROSS JOIN
LATERAL
(SELECT XMLAGG( XMLFOREST(mac_address) ) AS mac_address
FROM T
WHERE T.id = M.id
) AS T
CROSS JOIN
LATERAL
(SELECT XMLAGG( XMLFOREST(sw_name) ) AS sw_name
FROM S
WHERE S.id = M.id
) AS S
;
 >> Stay informed about: Another question XML Output 
Back to top
Login to vote
Display posts from previous:   
Related Topics:
ho w to see the output of "Message_Text" - Hi , I would like to know how to we see the output of "MESSAGE_TEXT " . Below is 1 such procedure .. create procedure mess_test (out p_sqlstate char(5) , out p_sqlcode int ) language sql specific mess_test begin declare v_count int; declare s...

Purging task output - Helpful folks, I have tasks defined in Task Center, on UDB V8.2 on Windows, that accumulate output at a rapid rate, and manually deleting them via the Journal is an arduous task. So to speak. Is it safe to simply run a job that deletes directly from..

What's the meaning of IID=0 in output of db2pd command - In output of comand "db2pd -d <dbname> -tcbstats index", what's the meaning of IID=0? Please advise. Thanks so much. James

increase the size of UNIX window to see the entire output .. - hi , I am running a " select " query on my DB2 Table ....which has around 45 columns ..from UNIX prompt . The query output is quiet staggered . Cant we set the window size to accomodate all the DB2 columns . Is their any way out to do that ....

LOAD question - Is there way of telling the load utility that if it finds spaces in the input file, where it expects an integer, to insert a zero? Currently I am getting an error. SQL3116W The field value in row "F0-1" and column "46" is missing,...
   Database Help (Home) -> DB2 All times are: Pacific Time (US & Canada)
Page 1 of 1

 
You can post new topics in this forum
You can reply to topics in this forum
You can edit your posts in this forum
You can delete your posts in this forum
You can vote in polls in this forum



[ Contact us | Terms of Service/Privacy Policy ]