2011-12-11 16 views
5

Tôi đang cố gắng tìm nhân viên làm việc cho các dự án ở Houston nhưng bộ phận dự án được đặt tại không nằm ở Houston. Tôi đã cố gắng mô hình hóa biểu thức sau this ví dụ về biểu thức FLWOR nhưng truy vấn không trả về bất kỳ thứ gì và nó sẽ trả lại kết quả.Sử dụng biểu thức FLWOR xquery để tìm nhiều hạn chế "ở đâu"

chỉnh sửa: Đây là 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

Bạn quên cho chúng ta thấy tài liệu XML. –

+0

Xin lỗi tôi đã thêm tập tin đầu vào. – mnky9800n

Trả lời

6

Điều khoản for là đủ; nếu không, bạn sẽ lặp qua tất cả nhân viên nhiều lần:

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

Xin lỗi tôi đã thêm tập tin đầu vào. – mnky9800n

+0

Chỉnh sửa nhẹ; phiên bản này của truy vấn sẽ được đánh giá nhanh hơn bởi một số bộ xử lý XQuery (chẳng hạn như BaseX). –

1

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

Bạn đã có một "s" quá nhiều: là plocations.

+0

Hmm, điều này tạo ra rất nhiều bản sao. Tôi đã thử 'các giá trị riêng biệt (truy vấn ở trên)' nhưng nó nói có một lỗi cú pháp tuy nhiên nó được khuyến khích để làm điều đó theo cách đó từ [bài đăng stackoverflow này] (http://stackoverflow.com/questions/3702764/xquery-distinct -giá trị-với-nơi-khoản-vấn đề). – mnky9800n

2

Một đơn biểu thức XPath 2.0 có thể chọn tất cả các nhân viên muốn:

/*/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 có tốt hơn bằng cách sử dụng XQuery không? – mnky9800n

+0

Thực ra, lợi thế duy nhất sử dụng XPath thuần túy là bạn cũng có thể sử dụng nó với các bộ xử lý không hỗ trợ XQuery. –

+0

@ mnky9800n: @_Christian Grün đã trả lời câu hỏi của bạn. Trong một cảm giác, có thể thể hiện một cái gì đó trong XPA thuần khiết làm cho giải pháp của bạn cuối cùng di động hơn. Ví dụ, bạn có thể đánh giá biểu thức XPath này không chỉ với bộ xử lý XQuery của bạn (XPath là một tập hợp con của XQuery) mà còn trong bất kỳ bộ xử lý XSLT 2.0 hoặc 3.0 XSLT hoặc trong bất kỳ công cụ XPath 2.0 hoặc 3.0 độc lập nào. của PsychiPath). –