2009-01-27 7 views

Trả lời

9

Vâng, đây là an example từ XQuery spec:..

"tham gia, trong đó kết hợp dữ liệu từ nhiều nguồn khác nhau vào một kết quả duy nhất, là một loại rất quan trọng của truy vấn Trong phần này chúng tôi sẽ minh họa cách nhiều loại tham gia có thể được thể hiện bằng XQuery Chúng tôi sẽ căn cứ các ví dụ về ba loại giấy tờ sau:.

  1. Một tài liệu có tên parts.xml có chứa nhiều yếu tố part; mỗi part yếu tố lần lượt chứa partnodescription phần phụ.
  2. Tài liệu có tên suppliers.xml có chứa nhiều yếu tố supplier; mỗi phần tử supplier lần lượt chứa các thuộc tính suppnosuppname.
  3. Tài liệu có tên catalog.xml có chứa thông tin về mối quan hệ giữa nhà cung cấp và các bộ phận. Tài liệu danh mục chứa nhiều phần tử item, mỗi phần tử này chứa các phần tử phụ là partno, suppnoprice.

Tham gia thông thường ("bên trong") trả về thông tin từ hai hoặc nhiều nguồn liên quan, như minh họa bằng ví dụ sau, kết hợp thông tin từ ba tài liệu. Ví dụ tạo ra một "danh mục mô tả" có nguồn gốc từ tài liệu danh mục, nhưng có chứa phần mô tả thay vì số phần và tên nhà cung cấp thay vì số nhà cung cấp. Các cửa hàng mới được đặt theo thứ tự abc bằng cách mô tả một phần và secondarily theo tên nhà cung cấp. *

<descriptive-catalog> 
    { 
    for $i in fn:doc("catalog.xml")/items/item, 
     $p in fn:doc("parts.xml")/parts/part[partno = $i/partno], 
     $s in fn:doc("suppliers.xml")/suppliers 
        /supplier[suppno = $i/suppno] 
    order by $p/description, $s/suppname 
    return 
     <item> 
      { 
      $p/description, 
      $s/suppname, 
      $i/price 
      } 
     </item> 
    } 
</descriptive-catalog> 

các truy vấn trước đó trả về thông tin chỉ về các bộ phận có các nhà cung cấp và các nhà cung cấp có các bộ phận. An tham gia bên ngoài là một tham gia lưu giữ thông tin từ một hoặc nhiều nguồn tham gia, bao gồm các phần tử không có phần tử phù hợp trong nguồn khác.Ví dụ, một trái bên ngoài tham gia giữa nhà cung cấp và các bộ phận có thể quay trở lại thông tin về các nhà cung cấp mà không có bộ phận phù hợp."

Do lưu ý rằng XQuery không có một tài liệu chuẩn() chức năng (nó là một XSLT function) và thay vào đó có doc() chức năng, mà là một phần của "XQuery 1.0 and XPath 2.0 Functions and Operators"

có ít nhất hai lỗi trong câu trả lời của Chris:.

  1. XQuery is case sensitive - từ khóa được viết hoa được sử dụng trong ví dụ của Chris sẽ không được bộ xử lý XQuery phù hợp cho phép.
  2. Không cần tiền tố hàm chuẩn như doc(), tôi chỉ trích dẫn thông số XQuery, có tiền tố. Nếu không, trong mã của riêng tôi, tôi sẽ bỏ qua tiền tố "fn".
  3. Tài liệu hàm() không phải là hàm XQuery/XPath chuẩn. Chức năng doc() nên được sử dụng thay thế.
0

Trong XQuery nếu bạn viết một cái gì đó như sau:

for $x in doc('doc1.xml')//a 
for $y in doc('doc2.xml')//a 
where $x/@name = $y/@name 
return $x 

sau đó xử lý XQuery của bạn nên được đủ thông minh để nhận ra rằng đây là một tham gia.

Bạn không bao giờ chỉ định rõ ràng trong XQuery rằng có gì đó tham gia. Chủ đề chung trong XQuery là chương trình của bạn cho biết thông tin nào bạn muốn, không phải cách để tính toán nó.

Mặc dù có vẻ như bạn đang lặp đi lặp lại tài liệu thứ hai trong thực tế, một bộ xử lý XQuery thực sự sẽ thực hiện điều này một cách thông minh hơn, tương tự như câu lệnh SQL sau đây (SQL của tôi rất là xấu) nên tôi xin lỗi nếu cú ​​pháp này hoàn toàn sai)

SELECT doc1.a 
FROM doc1 INNER JOIN doc2 
WHERE doc1.name = doc2.name 

Điểm chuẩn XMark chứa một số truy vấn mẫu, đây là cũng có giá trị một cái nhìn. Trong các truy vấn cụ thể 9 đến 12 thực hiện các phép nối.

0

nó là dễ dàng hơn mà (ít nhất là sử dụng SAXON):

let $items := (
    doc("file1.xml") , 
    doc("file2.xml") , 
    doc("file3.xml") 
) 

for $x in $items ... 
+1

Nó có thể là một lỗi đánh máy, nhưng bạn đang mở 'file1.xml' 3 lần. –