6

ヒューストンにあるプロジェクトに取り組んでいる従業員を見つけようとしていますが、プロジェクトが所属する部門がヒューストンにありません。このFLWOR 式の例の後に式をモデル化しようとしましたが、クエリは何も返さず、結果を返す必要があります。

編集:これが入力です。

xquery
let $doc := doc("~path/company.xml")
for $e in $doc//employee,
    $d in $doc//department,
    $p in $doc//projects
where $d/locations[location!="Houston"]
and $p/project[plocations="Houston"]
return <e>{$e/fname}{$e/lname}{$e/address}</e>
/
4

3 に答える 3

6

1 つのfor句で十分です。そうしないと、すべての従業員を数回繰り返します。

let   $doc := doc(...)
for   $e in $doc//employee
let   $p := $doc//project[@pnumber = $e/projects/worksOn/@pno]
where $p[plocation = 'Houston']
  and $doc//department[@dno = $p/@controllingDepartment]
                      [not(locations/location = 'Houston')]
return <e>{ $e/fname }{ $e/lname }{ $e/address }</e>
于 2011-12-11T22:57:08.067 に答える
2

単一の XPath 2.0 式で、必要なすべての従業員を選択できます。

/*/employees
     /*[projects/*/@pno
       =
        /*/projects/*
               [plocation eq 'Houston'
              and
                boolean
                (for $dn in @controllingDepartment
                  return
                   /*/departments/*
                       [@dno eq $dn
                      and
                        not(locations/location
                          =
                           'Houston'
                           )
                       ]
                )
               ]/@pnumber
       ]
于 2011-12-11T23:44:46.553 に答える
1

打ち間違え:and $p/project[plocation="Houston"]

「s」が多すぎます: でしたplocations

于 2011-12-11T23:19:44.063 に答える