0

Sample1.xml

<data><row><id>949459</id><product_id>4119945117</product_id></row>
    <row><id>781351</id><product_id>1009460692</product_id></row>
    <row><id>780163</id><product_id>1009755673</product_id></row>
    <row><id>1017226</id><product_id>1013393868</product_id></row>
    <row><id>1017956</id><product_id>1013393871</product_id></row>
    <row><id>1017310</id><product_id>1013393874</product_id></row>
    <row><id>771708</id><product_id>4388803569</product_id></row>
    <row><id>3270790</id><product_id>1013679270</product_id></row>
    <row><id>775869</id><product_id>1014142699</product_id></row>
    <row><id>1017599</id><product_id>1021870484</product_id></row>
    <row><id>1018789</id><product_id>1021870489</product_id></row>
    <row><id>1017091</id><product_id>1021870491</product_id></row>
    <row><id>1017333</id><product_id>1021870492</product_id></row>
    <row><id>1017630</id><product_id>1021870493</product_id></row>
    <row><id>1017774</id><product_id>1021870495</product_id></row>
    <row><id>1018192</id><product_id>1021870496</product_id></row>
    <row><id>1018725</id><product_id>4408034849</product_id></row>
    <row><id>1017990</id><product_id>1021870498</product_id></row>
    <row><id>1018027</id><product_id>1021870499</product_id></row>
    <row><id>1017166</id><product_id>1021870500</product_id></row>
    <row><id>769120</id><product_id>1032140806</product_id></row>
    <row><id>950336</id><product_id>1035310069</product_id></row>
    </data>

sample2.xml

<productSet>
 <row><product>4388803569</product></row>
 <row><product>4408034289</product></row>
 <row><product>4408034589</product></row>
 <row><product>4408034849</product></row>
 <row><product>4094557957</product></row>
 <row><product>4119945117</product></row>
</productSet>

サンプル 2 ファイルの product_id 要素と比較して、サンプル 1 XML ファイルからすべての製品要素の値を返す Xquery を次に示します。ここでは、利用できない製品をすべて取得しようとしています。

<outProduct_10310>
{ for $b in doc("sample1.xml")/data/row,
      $a in doc("sample2.xml")/productSet/row[product != $b/product_id]
  return   
      <op_id> { $b/product_id/text() } </op_id>
  }  </outProduct_10310>

このコードは、これら 2 つの XML を等号で比較すると正しい一致データを返しますが、一致しないデータを取得したいのですが、上記のコードを実行すると、次の出力が得られます。

<outProduct_10310>
  <op_id>4119945117</op_id>
  <op_id>4119945117</op_id>
  <op_id>4119945117</op_id>
  <op_id>4119945117</op_id>
  <op_id>4119945117</op_id>
  <op_id>1009460692</op_id>
  <op_id>1009460692</op_id>
  <op_id>1009460692</op_id>
  <op_id>1009460692</op_id>
  <op_id>1009460692</op_id>
  <op_id>1009460692</op_id>
  <op_id>1009755673</op_id>
  <op_id>1009755673</op_id>
  <op_id>1009755673</op_id>
  <op_id>1009755673</op_id>
  <op_id>1009755673</op_id>
  <op_id>1009755673</op_id>
  <op_id>1013393868</op_id>
  <op_id>1013393868</op_id>
  <op_id>1013393868</op_id>
  <op_id>1013393868</op_id>
  <op_id>1013393868</op_id>
  <op_id>1013393868</op_id>
  <op_id>1013393871</op_id>
  <op_id>1013393871</op_id>
  <op_id>1013393871</op_id>
  <op_id>1013393871</op_id>
  <op_id>1013393871</op_id>
  <op_id>1013393871</op_id>
  <op_id>1013393874</op_id>
  <op_id>1013393874</op_id>
  <op_id>1013393874</op_id>
  <op_id>1013393874</op_id>
  <op_id>1013393874</op_id>
  <op_id>1013393874</op_id>
  <op_id>4388803569</op_id>
  <op_id>4388803569</op_id>
  <op_id>4388803569</op_id>
  <op_id>4388803569</op_id>
  <op_id>4388803569</op_id>
  <op_id>1013679270</op_id>
  <op_id>1013679270</op_id>
  <op_id>1013679270</op_id>
  <op_id>1013679270</op_id>
  <op_id>1013679270</op_id>
  <op_id>1013679270</op_id>
  <op_id>1014142699</op_id>
  <op_id>1014142699</op_id>
  <op_id>1014142699</op_id>
  <op_id>1014142699</op_id>
  <op_id>1014142699</op_id>
  <op_id>1014142699</op_id>
  <op_id>1021870484</op_id>
  <op_id>1021870484</op_id>
  <op_id>1021870484</op_id>
  <op_id>1021870484</op_id>
  <op_id>1021870484</op_id>
  <op_id>1021870484</op_id>
  <op_id>1021870489</op_id>
  <op_id>1021870489</op_id>
  <op_id>1021870489</op_id>
  <op_id>1021870489</op_id>
  <op_id>1021870489</op_id>
  <op_id>1021870489</op_id>
  <op_id>1021870491</op_id>
  <op_id>1021870491</op_id>
  <op_id>1021870491</op_id>
  <op_id>1021870491</op_id>
  <op_id>1021870491</op_id>
  <op_id>1021870491</op_id>
  <op_id>1021870492</op_id>
  <op_id>1021870492</op_id>
  <op_id>1021870492</op_id>
  <op_id>1021870492</op_id>
  <op_id>1021870492</op_id>
  <op_id>1021870492</op_id>
  <op_id>1021870493</op_id>
  <op_id>1021870493</op_id>
  <op_id>1021870493</op_id>
  <op_id>1021870493</op_id>
  <op_id>1021870493</op_id>
  <op_id>1021870493</op_id>
  <op_id>1021870495</op_id>
  <op_id>1021870495</op_id>
  <op_id>1021870495</op_id>
  <op_id>1021870495</op_id>
  <op_id>1021870495</op_id>
  <op_id>1021870495</op_id>
  <op_id>1021870496</op_id>
  <op_id>1021870496</op_id>
  <op_id>1021870496</op_id>
  <op_id>1021870496</op_id>
  <op_id>1021870496</op_id>
  <op_id>1021870496</op_id>
  <op_id>4408034849</op_id>
  <op_id>4408034849</op_id>
  <op_id>4408034849</op_id>
  <op_id>4408034849</op_id>
  <op_id>4408034849</op_id>
  <op_id>1021870498</op_id>
  <op_id>1021870498</op_id>
  <op_id>1021870498</op_id>
  <op_id>1021870498</op_id>
  <op_id>1021870498</op_id>
  <op_id>1021870498</op_id>
  <op_id>1021870499</op_id>
  <op_id>1021870499</op_id>
  <op_id>1021870499</op_id>
  <op_id>1021870499</op_id>
  <op_id>1021870499</op_id>
  <op_id>1021870499</op_id>
  <op_id>1021870500</op_id>
  <op_id>1021870500</op_id>
  <op_id>1021870500</op_id>
  <op_id>1021870500</op_id>
  <op_id>1021870500</op_id>
  <op_id>1021870500</op_id>
  <op_id>1032140806</op_id>
  <op_id>1032140806</op_id>
  <op_id>1032140806</op_id>
  <op_id>1032140806</op_id>
  <op_id>1032140806</op_id>
  <op_id>1032140806</op_id>
  <op_id>1035310069</op_id>
  <op_id>1035310069</op_id>
  <op_id>1035310069</op_id>
  <op_id>1035310069</op_id>
  <op_id>1035310069</op_id>
  <op_id>1035310069</op_id>
</outProduct_10310>

私は xquery に全く慣れていません。比類のないデータのみを取得する方法を教えてもらえますか?

4

2 に答える 2

2

まず、シーケンスを指定すると、標準の=演算子が等しい値を検索するため、IDのすべてのペアをforループと比較する必要はありません。

したがって、一致するすべての製品を見つける簡単な方法は次のとおりです。

<outProduct_10310>
{ for $b in doc("sample1.xml")/data/row[product_id = doc("sample2.xml")/productSet/row/product]
  return   
      <op_id> { $b/product_id/text() } </op_id>
  }  
</outProduct_10310>

また、一致しない製品については、not演算子と一致しないすべての製品を選択できます:(常に異なるIDが存在するため、ここでは!=を使用できないことに注意してください)

<outProduct_10310>
{ for $b in doc("sample1.xml")/data/row[not (product_id = doc("sample2.xml")/productSet/row/product) ]
  return   
      <op_id> { $b/product_id/text() } </op_id>
  }  
</outProduct_10310>

XQueryエンジンの性能によっては、角かっこdoc("sample2.xml")/productSet/rowから外して変数に格納することをお勧めします。[..]

于 2012-08-21T14:23:07.997 に答える
1

すべての一般的な比較 (=、!=、...) は、左側のオペランドのすべての項目を右側のオペランドのすべての項目と比較することに注意してください。比較が成功すると (つまり、 yields true)、結果も真になります。例として、(1,2) != (1,2)は を返します。trueこれは、1 回の比較で1 != 2が得られるためtrueです。

特定のクエリでは、代わりに試すことができます。not(product = $b/product_id)これは、true を返す単一の比較がない場合にのみ true を返します。

于 2012-08-21T14:17:14.177 に答える