XQUERY выбирает разные строки в нескольких тегах

у меня есть таблица в оракуле

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 таких отзывов с несколькими тегами обзора внутри каждого из них.

Мне нужны идентификаторы повторяющегося тега в разных строках

Я написал следующий запрос

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

Приведенный выше запрос дает мне вывод как M17 M18 M19, если внутри одного и того же тега REVIEW.

Я получаю все три в одной строке, я хочу их в 3 разных строках.

M17
M18
M19

Любая идея, что не так с запросом.


person user2290024    schedule 17.04.2013    source источник


Ответы (1)


Соединение 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

Но в случае 10g все сложнее, потому что такая конструкция всегда получает значение для поля REVIEWS из первой выбранной записи. Трюки с мультимножествами не будут работать и приведут к тем же результатам (получены значения из первой записи).

Я нашел единственное решение для 10g, объединив все результаты с помощью XMLAgg() в одну запись, а затем создав новый набор данных из этой записи с помощью XMLTable().

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'
  )    

Извините, я не могу сейчас протестировать этот запрос, но надеюсь, что этого достаточно, чтобы дать вам представление о том, как он выглядит.

P.S. Если кто-нибудь может объяснить такое поведение Oracle 10g в случае объединения с XMLTable(), построенным из поля, было бы неплохо :)

person ThinkJet    schedule 17.04.2013
comment
Удивительно › ТАБЛИЦА XML РАБОТАЕТ ХОРОШО. Большое спасибо - person user2290024; 20.04.2013