1

我在 oracle 中有一张桌子

create table MOVIE
(MOVIE_ID VARCHAR2(10 BYTE),
TITLE VARCHAR2(50 BYTE),
DIRECTOR VARCHAR2(50 BYTE),
WRITER VARCHAR2(50 BYTE),
GENRE VARCHAR2(50 BYTE),
RELEASE_DATE DATE,
RUNTIME NUMBER,
REVIEWS XMLTYPE);

审查是 XML 类型

每条评论都有多个标签,REVIEW(MORE THAN ONE TAG WITH A TAG) 我有 25 条这样的评论,每个评论中都有多个评论标签

我想要在不同行中重复标签的 id

我写了以下查询

SELECT 
XMLQuery(
'for $i in distinct-values (/Reviews/REVIEW/ID)
return data($i)'
PASSING REVIEWS RETURNING CONTENT) ID
FROM MOVIE;

如果在同一个 REVIEW 标记内,上面的查询给我输出为 M17 M18 M19。

我将所有三个放在一行中,我希望它们放在 3 个不同的行中。

M17
M18
M19

知道查询有什么问题。

4

1 回答 1

0

XMLTable() 与MOVIE表连接必须适用于11g

select 
   m.movie_id,
   id_list.review_id
from 
  movie m,
  XMLTable(
    'for $i in distinct-values($param/Reviews/REVIEW/ID) return $i'
    passing m.reviews as "param"
    columns review_id varchar2(4000) path '//ID'
  ) id_list

但是在10gREVIEWS的情况下,它会变得更难,因为这样的构造总是从第一个选择的记录中获得字段的值。多重集的技巧将不起作用并产生相同的结果(从第一条记录中获取值)。

通过将 XMLAgg() 的所有结果聚合到一条记录中,然后使用 XMLTable() 从该记录构建新数据集,我找到了10g的唯一解决方案。

select
  movie_id,
  review_id
from 
  XMLTable(
    '
      for $movie in $big_root/full_list/movie_entry,
          $review_id in $movie/ID
      return <row><movie_id>{data($movie/@movie_id)}</movie_id><review_id>{$id}</review_id></row> 
    '
    passing 
      (
        select 
          XMLElement("full_list", 
            XMLAgg(
              XMLElement("movie_entry",
                XMLAttributes(m.movie_id as "movie_id"),
                XMLQuery(
                  'for $i in distinct-values($param/Reviews/REVIEW/ID) return $i'
                   passing by value m.reviews as "param"
                   returning content
                ) 
              )
            )
          )
        from 
          movie m
      )
    as "big_root"
    columns 
      movie_id varchar2(4000) path '//row/movie_id',
      review_id varchar2(4000) path '//row/review_id'
  )    

抱歉,我现在无法测试此查询,但希望它足以让您了解它的外观。

PS如果有人可以解释Oracle 10g在加入从字段构造的XMLTable()的情况下的这种行为,那就太好了:)

于 2013-04-17T10:53:41.157 回答