2013-01-17 5 views
2

데이터를 가져 와서 다른 파일에 삽입하고 있습니다. 그러나 삽입 된 데이터는 정렬되지 않습니다. 다음은 내가 성취하고자하는 목표의 예입니다.XQuery를 가져 와서 동시에 넣으십시오.

let $n := <N> 
<n>Lemon</n> 
<n>Chickoo</n> 
<n>Banana</n> 
<n>Orange</n> 
<n>Pineapple</n> 
<n>Apple</n> 
<n>Lemon</n> 
<n>Chickoo</n> 
<n>Banana</n> 
</N> 

for $x in distinct-values($n/n) 
order by $x 
return 
    insert node <n>{$x}</n> into doc('fruits')/fruit 

이 다음에 fruits의 출력이 될 때 - 검색하는 동안 언급하지만

<fruit> 
      <n>Lemon</n> 
      <n>Chickoo</n> 
      <n>Banana</n> 
      <n>Orange</n> 
      <n>Pineapple</n> 
      <n>Apple</n> 
    </fruit> 

그것이, 주문하지 ...!

답변

2

이는 BaseX가 order by FLWOR 절을 평가하는 방법에 대한 버그이며, 이제는 GitHub bug tracker에 문서화되어 있습니다. return 절은 후행 대신 정렬되기 전에 평가되므로 잘못된 순서로 업데이트가 추가됩니다.

해결 방법은하는 것 중 또 다른 FLWOR 표현식에서 정렬을 수행

for $x in 
    for $d in distinct-values($n/n) 
    order by $d 
    return $d 
order by $x 
return 
    insert node <n>{$x}</n> into doc('fruits')/fruit 

또 다른 (아마도 더 우아한) 솔루션은 한 번만 평가되어야 할 insert nodes을 사용하는 것입니다

insert nodes 
    for $x in distinct-values($n/n) 
    order by $x 
    return <n>{$x}</n> 
into doc('fruits')/fruit 
+0

고마워. 그것은 효과가 있었다. :) – John

0

내게 버그라고 느껴집니다. 스펙은 다음과 같습니다 :

단일 삽입 표현식에 의해 여러 노드가 삽입되는 경우, 그 순서는 소스 표현식의 노드 순서를 보존합니다.

정확하게 명확하지는 않지만 결과가 올바르게 분류 될 것이라고 기대할 수 있습니다.

어떤 XQuery 업데이트 구현을 사용하고 있습니까?

+0

이것은 BaseX의 버그입니다. GitHub에 [버그 리포트] (https://github.com/BaseXdb/basex/issues/621)를 제출했습니다. –