2014-03-27 124 views
0

以下是XML文件 -的XQuery導致內存不足錯誤

<Info> 
    <Name> 
    <P1>Tomy</P1> 
    <P2>John</P2> 
    <R>P2</R> 
    </Name> 
    <Name> 
    <P1>Tomy</P1> 
    <P2>John</P2> 
    <R>P1</R> 
    </Name> 
    <Name> 
    <P1>Rojer</P1> 
    <P2>Messi</P2> 
    <R>P2</R> 
    </Name> 
    <Name> 
    <P1>Messi</P1> 
    <P2>Carl</P2> 
    <R>P2</R> 
    </Name> 
    <Name> 
    <P1>Messi</P1> 
    <P2/> 
    <R>P1</R> 
    </Name> 

</Info> 

P1是球員1號和P2是Player 2號,R是本場比賽的結果。 我想用以下格式列出玩家的名字,並有不同的發生。

<P>Tomy V John</P> 
<P>Rojer V Messi</P> 
<P>Messi V John</P> 
<P>Messi</P> 

以下是解決方案,它提供了所需的輸出 -

let $o := doc('sam')//Name 
for $x in $o 
    let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2/text()) else $x/P1/text() 
    for $y in $p 
    group by $y 
    order by $y 
    return <a>{$y}</a> 

但此查詢更好只適用於某些選定的記錄。實際上,我有200000多條記錄,當我執行這個查詢時,我得到了內存不足錯誤。我使用的是BaseX 7.6。

如果我刪除group by子句,執行時沒有錯誤,但它給出了錯誤的結果ie;具有重複的值。我需要獨特的結果。

任何幫助?

回答

1

試試這個

for $x in doc('sam')//Name 
    let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2 /text()) else $x/P1/text() 
    group by $p 
    order by $p 
    return <a>{$p}</a> 
+0

非常感謝。你能解釋我爲什麼得到OOM嗎? – John

+1

@John你只是在內存中有很多條目。您還可以從-Xmx = 1024mb(或任何適合的值)選項開始增加BaseX的內存。 – dirkk

+0

@dirkk是的,這是可以做到的,但我認爲我使用2'let'和2'for'使情況複雜化。答案中的查詢工作正常。 – John

相關問題