Взаимодейситвие XML и аналитических функций

nord_tramper
Дата: 06.12.2007 18:32:21
Столкнулся со следующей ситацией. Есть селект
with t as (
 select 1 as col1,1 as col2 from dual
 union all
 select 2,2 from dual
 union all
 select 3,2 from dual
 union all 
 select 4,3 from dual
 union all
 select 5,4 from dual
)
select 
       col1 "Col1",
       col2 "Col2",
       dense_rank() over(order by col2) "Num"
from t;  

возвращает
                                  Col1                                   Col2                                    Num
-------------------------------------- -------------------------------------- -------------------------------------
                                     1                                      1                                      1 
                                     2                                      2                                      2 
                                     3                                      2                                      2 
                                     4                                      3                                      3 
                                     5                                      4                                      4 


Пробую завернуть все это в XML

with t as (
 select 1 as col1,1 as col2 from dual
 union all
 select 2,2 from dual
 union all
 select 3,2 from dual
 union all 
 select 4,3 from dual
 union all
 select 5,4 from dual
)
select 
  XMLAgg(
    XMLElement("Test",
      XMLForest(
       col1 "Col1",
       col2 "Col2",
       dense_rank() over(order by col2) "Num"
      )
    )
  )
from t;  

а получаю вот что
	<Test>
		<Col1>1</Col1>
		<Col2>1</Col2>
	</Test>
	<Test>
		<Col1>2</Col1>
		<Col2>2</Col2>
	</Test>
	<Test>
		<Col1>3</Col1>
		<Col2>2</Col2>
	</Test>
	<Test>
		<Col1>4</Col1>
		<Col2>3</Col2>
	</Test>
	<Test>
		<Col1>5</Col1>
		<Col2>4</Col2>
	</Test>

Т.е. нет колонки "Num".. куда она делась?! В боевом запросе - получаю вообще дисконнект от базы.
p@sh@
Дата: 06.12.2007 21:49:28
nord_tramper
Т.е. нет колонки "Num".. куда она делась?! В боевом запросе - получаю вообще дисконнект от базы.
Оконные функции здесь не допустимы, т.к. XMLAgg - это все таки агрегат. Используйте подзапрос:
with t as (
 select 1 as col1,1 as col2 from dual
 union all
 select 2,2 from dual
 union all
 select 3,2 from dual
 union all 
 select 4,3 from dual
 union all
 select 5,4 from dual
)
select 
  XMLAgg(
    XMLElement("Test",
      XMLForest(
       col1 "Col1",
       col2 "Col2",
       num "Num"
      )
    )
  )
from (
       select col1, col2, dense_rank() over(order by col2) num from t
     );