2013-04-17 60 views
1

我有一個表在Oracle選擇不同行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條這樣的評論裏面多次複查標籤多個標籤他們每個人的

我想

我已經寫在不同的行重複標籤的ID以下查詢

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

上面的查詢是給我的輸出作爲 M17 M18 M19是否有相同的審查標籤內。

我得到所有三個在一個單一的行 我希望他們在3個不同的行。

M17 
M18 
M19 

任何想法什麼是錯誤的查詢。

回答

0

的XMLTable()與MOVIE表連接必須爲11克工作:

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 

10克的情況下,它會更難,因爲這樣的建築總是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()構建領域,這將是很好:)

+0

Awesome> XML TABLE WORKS WELL。非常感謝 – user2290024

+0

歡迎:) – ThinkJet