2011-12-11 98 views
5

我正在嘗試查找位於休斯頓的項目的員工,但該項目所在的部門不在休斯敦。我試圖在this FLWOR表達式的示例之後對錶達式建模,但查詢不返回任何內容,並且它應返回結果。使用xquery FLWOR表達式查找多個「where」限制

編輯:這是input

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> 
/
+0

你忘了我們展示的XML文檔。 –

+0

對不起,我添加了輸入文件。 – mnky9800n

回答

6

一個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> 
+0

對不起,我添加了輸入文件。 – mnky9800n

+0

略作編輯;這個版本的查詢將被一些XQuery處理器(如BaseX)更快地評估。 –

1

錯字:and $p/project[plocation="Houston"]

你有一個 「s」 太:是plocations

+0

嗯,這產生了很多複製。我嘗試'獨特的價值(查詢上面)',但它說有一個語法錯誤,但建議這樣做[這stackoverflow帖子](http://stackoverflow.com/questions/3702764/xquery-distinct - 值 - 與-where子句-問題)。 – mnky9800n

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 
     ] 
+0

XPath在某種程度上比使用XQuery更好嗎? – mnky9800n

+0

實際上,使用純XPath的唯一好處是您可以將其與不支持XQuery的處理器一起使用。 –

+0

@ mnky9800n:@_ChristianGrün回答了你的問題。從某種意義上說,能夠在純粹的XPAth中表達某種東西使得您的解決方案最終更具可移植性。例如,您不僅可以使用您的XQuery處理器(XPath是XQuery的一個子集),而且可以在任何XSLT 2.0或3.0 XSLT處理器或任何獨立的XPath 2.0或3.0引擎中評估此XPath表達式(唉,我只知道PsychiPath)。 –