Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 理解XQuery中的连接_Xml_Join_Xquery - Fatal编程技术网

Xml 理解XQuery中的连接

Xml 理解XQuery中的连接,xml,join,xquery,Xml,Join,Xquery,我有两个要使用XQuery连接的XML文档。我知道数据包含一些重复条目 test1.xml <marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim"> <marc:record> <marc:leader>01225cam a2200373Mi 4500</marc:leader> <marc:controlfield tag="0

我有两个要使用XQuery连接的XML文档。我知道数据包含一些重复条目

test1.xml

<marc:collection
    xmlns:marc="http://www.loc.gov/MARC21/slim">
    <marc:record>
        <marc:leader>01225cam a2200373Mi 4500</marc:leader>
        <marc:controlfield tag="001">5323084</marc:controlfield>
        <marc:datafield
            ind1="1"
            ind2="4"
            tag="245">
            <marc:subfield code="a">Els teleclubs a les illes Balears :</marc:subfield>             
        </marc:datafield>
    </marc:record>
    <marc:record>
        <marc:leader>01225cam a2200373Mi 4500</marc:leader>
        <marc:controlfield tag="001">5323084</marc:controlfield>
        <marc:datafield
            ind1="1"
            ind2="4"
            tag="245">
            <marc:subfield code="a">Els teleclubs a les illes Balears :</marc:subfield>             
        </marc:datafield>
    </marc:record>
    <marc:record>
        <marc:leader>00818cam a2200241Mi 4500</marc:leader>
        <marc:controlfield tag="001">6310976</marc:controlfield>
        <marc:datafield
            ind1="0"
            ind2="0"
            tag="245">
            <marc:subfield code="a">Diccionari manual de sinònims i antònims de la llengua catalana /</marc:subfield>             
        </marc:datafield>
    </marc:record>
</marc:collection>
运行此操作时,前两个匹配的值会重复出现:

<test n="5912416">Els teleclubs a les illes Balears :</test>
<test n="5912416">Els teleclubs a les illes Balears :</test>
<test n="5912416">Els teleclubs a les illes Balears :</test>
<test n="5912416">Els teleclubs a les illes Balears :</test>
<test n="5935043">Diccionari manual de sinònims i antònims de la llengua catalana /</test>
结果

<test c="5912416">Els teleclubs a les illes Balears : Els teleclubs a les illes Balears :</test>
<test c="5935043">Diccionari manual de sinònims i antònims de la llengua catalana /</test
Els teleclubs a les illes Balears:Els teleclubs a les illes Balears:

Dicconari manual de sinònims i antònims de la llengua catalana/这是预期的行为,在SQL连接中也可以观察到类似的效果。当用于联接的键不唯一时,您将获得所有数据与匹配键的笛卡尔乘积

例如,在这种情况下,第一个XML中有2个
元素具有
BIB_ID
等于
5323084
,第二个XML中有2个
元素与该值匹配。因此,当2行数据与另外2行数据配对时,结果是所有可能的组合(请参见插图*),这将导致4种可能的组合(2x2),正如您在XQuery结果中所观察到的那样


*:该图实际上用于说明中的交叉联接,但效果相同。

这是预期的行为,在SQL联接中可以观察到类似的效果。当用于联接的键不唯一时,您将获得所有数据与匹配键的笛卡尔乘积

例如,在这种情况下,第一个XML中有2个
元素具有
BIB_ID
等于
5323084
,第二个XML中有2个
元素与该值匹配。因此,当2行数据与另外2行数据配对时,结果是所有可能的组合(请参见插图*),这将导致4种可能的组合(2x2),正如您在XQuery结果中所观察到的那样


*:该图实际上用于说明中的交叉联接,但效果相同。

这是预期的行为,在SQL联接中可以观察到类似的效果。当用于联接的键不唯一时,您将获得所有数据与匹配键的笛卡尔乘积

例如,在这种情况下,第一个XML中有2个
元素具有
BIB_ID
等于
5323084
,第二个XML中有2个
元素与该值匹配。因此,当2行数据与另外2行数据配对时,结果是所有可能的组合(请参见插图*),这将导致4种可能的组合(2x2),正如您在XQuery结果中所观察到的那样


*:该图实际上用于说明中的交叉联接,但效果相同。

这是预期的行为,在SQL联接中可以观察到类似的效果。当用于联接的键不唯一时,您将获得所有数据与匹配键的笛卡尔乘积

例如,在这种情况下,第一个XML中有2个
元素具有
BIB_ID
等于
5323084
,第二个XML中有2个
元素与该值匹配。因此,当2行数据与另外2行数据配对时,结果是所有可能的组合(请参见插图*),这将导致4种可能的组合(2x2),正如您在XQuery结果中所观察到的那样


*:该图实际上用于说明中的交叉联接,但效果相同。

许多XPath XQuery表达式消除重复节点,因为相同节点不会在结果中出现两次,但没有表达式消除重复节点,因为节点深度相等(所有子项、子项和属性都相同)

对于这个问题,我的直觉是在执行联接之前从输入中消除重复项,而不是从结果中消除重复项

“如果我真的想保留重复的条目(没有 不必要的重复),最好的方法是什么?”

根据我的经验,在这种情况下,你通常想要一个树状结构作为结果,而不是一个简单的结果,因此你必须把关系思维扔出门外

for $i in $input return
<parent value="{$i/something}">{
  for $j in $anotherInput[$j/xyz = $i/abc] return
    <child value="{$j/something}"> {
      f($i, $j)
    }</child>
}</parent>
用于$i输入返回中的$i
{
对于$j,在$anotherInput中[$j/xyz=$i/abc]返回
{
f($i,$j)
}
}

许多XPath XQuery表达式消除重复节点,因为同一节点不会在结果中出现两次,但没有表达式消除重复节点,因为节点深度相等(所有子节点、子节点和属性都相同)

对于这个问题,我的直觉是在执行联接之前从输入中消除重复项,而不是从结果中消除重复项

“如果我真的想保留重复的条目(没有 不必要的重复),最好的方法是什么?”

根据我的经验,在这种情况下,你通常想要一个树状结构作为结果,而不是一个简单的结果,因此你必须把关系思维扔出门外

for $i in $input return
<parent value="{$i/something}">{
  for $j in $anotherInput[$j/xyz = $i/abc] return
    <child value="{$j/something}"> {
      f($i, $j)
    }</child>
}</parent>
用于$i输入返回中的$i
{
对于$j,在$anotherInput中[$j/xyz=$i/abc]返回
{
f($i,$j)
}
}

许多XPath XQuery表达式消除重复节点,因为同一节点不会在结果中出现两次,但没有表达式消除重复节点,因为节点深度相等(所有子节点、子节点和属性都相同)

对于这个问题,我的直觉是在执行联接之前从输入中消除重复项,而不是从结果中消除重复项

“如果我真的想保留重复的条目(没有 不必要的重复),最好的方法是什么?”

根据我的经验,在这种情况下,你通常想要一个树状结构作为结果,而不是一个简单的结果,因此你必须把关系思维扔出门外

for $i in $input return
<parent value="{$i/something}">{
  for $j in $anotherInput[$j/xyz = $i/abc] return
    <child value="{$j/something}"> {
      f($i, $j)
    }</child>
}</parent>
用于$i输入返回中的$i
{
对于另一个输入中的$j[$j/xyz=$
for $i in $input return
<parent value="{$i/something}">{
  for $j in $anotherInput[$j/xyz = $i/abc] return
    <child value="{$j/something}"> {
      f($i, $j)
    }</child>
}</parent>