2011-12-11 30 views
5

Houston'da bulunan projelerde çalışan ancak bu projenin bulunduğu departmandaki çalışanların Houston'da bulunmadığını bulmaya çalışıyorum. İfadeyi, FLWOR ifadelerinin this örneğinden sonra modellemeye çalışıyordum, ancak sorgu hiçbir şey döndürmüyor ve sonuçların döndürülmesi gerekiyor.Birden çok "nerede" kısıtlaması bulmak için xquery FLWOR ifadelerini kullanma

düzenleme: İşte buradaki 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

Bize XML belgesi göstermek için unuttum. –

+0

Üzgünüz, giriş dosyasını ekledim. – mnky9800n

cevap

6

Bir for yan tümce; aksi takdirde tüm çalışanlara birkaç kez üzerinde yineleme edeceğiz:

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

Üzgünüz, giriş dosyasını ekledim. – mnky9800n

+0

Biraz düzenlenmiş; Sorgunun bu sürümü, bazı XQuery işlemcileri (örneğin, BaseX) tarafından daha hızlı değerlendirilecektir. –

1

Typo: plocations oldu:

and $p/project[plocation="Houston"] Bir "ler" çok fazla vardı.

+0

Hmm, bu çok fazla çoğaltma üretir. Ben farklı değerler (yukarıda sorgu) 'denedim ama bir sözdizimi hatası var, ancak [bu stackoverflow yazısından] bu şekilde yapılması önerilir (http://stackoverflow.com/questions/3702764/xquery-distinct -değerleri-ile-burada-şarttan problem). – mnky9800n

2

Tek XPath 2.0 ifade tüm çalışanları istedi seçebilirsiniz:

/*/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 kullanmanın bir yolu daha iyi midir? – mnky9800n

+0

Aslında, yalnızca XPath kullanan tek avantaj, XQuery'yi desteklemeyen işlemcilerde de kullanabilmenizdir. –

+0

@ mnky9800n: @_Christian Grün sorunuza cevap verdi. Bir anlamda, saf bir XPAth içinde bir şey ifade edebilmek, çözümünüzü daha taşınabilir hale getirir. Örneğin, bu XPath ifadesini yalnızca XQuery işlemcinizle değil (XPath XQuery'nin bir alt kümesidir), aynı zamanda herhangi bir XSLT 2.0 veya 3.0 XSLT işlemcisinde veya bağımsız bir XPath 2.0 veya 3.0 motorunda değerlendirebilirsiniz (Yalnızca farkındaım PsychiPath'ın). –