DocumentDB SQL - Truy vấn SQL tổng hợp

Composite Querycho phép bạn kết hợp dữ liệu từ các truy vấn hiện có và sau đó áp dụng các bộ lọc, tổng hợp, v.v. trước khi trình bày kết quả báo cáo, hiển thị tập dữ liệu được kết hợp. Truy vấn tổng hợp truy xuất nhiều cấp thông tin liên quan trên các truy vấn hiện có và trình bày dữ liệu kết hợp dưới dạng một kết quả truy vấn đơn và phẳng.

Sử dụng Truy vấn tổng hợp, bạn cũng có tùy chọn để -

  • Chọn tùy chọn cắt bớt SQL để loại bỏ các bảng và trường không cần thiết dựa trên các lựa chọn thuộc tính của người dùng.

  • Đặt mệnh đề ORDER BY và GROUP BY.

  • Đặt mệnh đề WHERE làm bộ lọc trên tập kết quả của truy vấn tổng hợp.

Các toán tử trên có thể được tạo thành các truy vấn mạnh mẽ hơn. Vì DocumentDB hỗ trợ các bộ sưu tập lồng nhau, thành phần có thể được nối hoặc lồng vào nhau.

Hãy xem xét các tài liệu sau đây cho ví dụ này.

AndersenFamily tài liệu như sau.

{ 
   "id": "AndersenFamily", 
   "lastName": "Andersen", 
	
   "parents": [ 
      { "firstName": "Thomas", "relationship":  "father" }, 
      { "firstName": "Mary Kay", "relationship":  "mother" } 
   ],
   
   "children": [ 
      { 
         "firstName": "Henriette Thaulow", 
         "gender": "female", 
         "grade": 5, 
         "pets": [ { "givenName": "Fluffy", "type":  "Rabbit" } ] 
      } 
   ],
   
   "location": { "state": "WA", "county": "King", "city": "Seattle" }, 
   "isRegistered": true 
}

SmithFamily tài liệu như sau.

{ 
   "id": "SmithFamily", 
	
   "parents": [ 
      { "familyName": "Smith", "givenName": "James" }, 
      { "familyName": "Curtis", "givenName": "Helen" } 
   ],
   
   "children": [ 
      { 
         "givenName": "Michelle", 
         "gender": "female", 
         "grade": 1 
      }, 
		
      { 
         "givenName": "John", 
         "gender": "male", 
         "grade": 7, 
			
         "pets": [ 
            { "givenName": "Tweetie", "type": "Bird" } 
         ] 
      } 
   ],
   
   "location": { 
      "state": "NY", 
      "county": "Queens", 
      "city": "Forest Hills" 
   },
   
   "isRegistered": true 
}

WakefieldFamily tài liệu như sau.

{ 
   "id": "WakefieldFamily", 
	
   "parents": [ 
      { "familyName": "Wakefield", "givenName": "Robin" }, 
      { "familyName": "Miller", "givenName": "Ben" } 
   ],
   
   "children": [ 
      { 
         "familyName": "Merriam", 
         "givenName": "Jesse", 
         "gender": "female", 
         "grade": 6,
			
         "pets": [ 
            { "givenName": "Charlie Brown", "type": "Dog" }, 
            { "givenName": "Tiger", "type": "Cat" }, 
            { "givenName": "Princess", "type": "Cat" } 
         ] 
      },
		
      { 
         "familyName": "Miller", 
         "givenName": "Lisa", 
         "gender": "female", 
         "grade": 3,
			
         "pets": [ 
            { "givenName": "Jake", "type": "Snake" } 
         ] 
      } 
   ],
   
   "location": { "state": "NY", "county": "Manhattan", "city": "NY" }, 
   "isRegistered": false 
}

Hãy xem một ví dụ về truy vấn nối.

Sau đây là truy vấn sẽ truy xuất id và vị trí của gia đình nơi đứa con đầu tiên givenName là Michelle.

SELECT f.id,f.location 
FROM Families f 
WHERE f.children[0].givenName = "Michelle"

Khi truy vấn trên được thực thi, nó tạo ra kết quả sau.

[
   { 
      "id": "SmithFamily", 
      "location": { 
         "state": "NY", 
         "county": "Queens", 
         "city": "Forest Hills" 
      }
   }
]

Hãy xem xét một ví dụ khác về truy vấn nối.

Sau đây là truy vấn sẽ trả về tất cả các tài liệu có lớp con đầu tiên lớn hơn 3.

SELECT * 
FROM Families f 
WHERE ({grade: f.children[0].grade}.grade > 3)

Khi truy vấn trên được thực thi, nó tạo ra kết quả sau.

[ 
   { 
      "id": "WakefieldFamily", 
      "parents": [ 
         { 
            "familyName": "Wakefield", 
            "givenName": "Robin" 
         },
		
         { 
            "familyName": "Miller", 
            "givenName": "Ben"
         } 
      ],
	  
      "children": [ 
         { 
            "familyName": "Merriam", 
            "givenName": "Jesse", 
            "gender": "female", 
            "grade": 6,
				
            "pets": [ 
               { 
                  "givenName": "Charlie Brown", 
                  "type": "Dog" 
               },
				
               { 
                  "givenName": "Tiger", 
                  "type": "Cat" 
               },
				
               { 
                  "givenName": "Princess", 
                  "type": "Cat" 
               } 
            ] 
         }, 
			
         { 
            "familyName": "Miller", 
            "givenName": "Lisa", 
            "gender": "female", 
            "grade": 3,
				
            "pets": [ 
               { 
                  "givenName": "Jake", 
                  "type": "Snake" 
               } 
            ] 
         } 
      ],
	  
      "location": { 
         "state": "NY", 
         "county": "Manhattan",
         "city": "NY" 
      },
	  
      "isRegistered": false, 
      "_rid": "Ic8LAJFujgECAAAAAAAAAA==", 
      "_ts": 1450541623, 
      "_self": "dbs/Ic8LAA==/colls/Ic8LAJFujgE=/docs/Ic8LAJFujgECAAAAAAAAAA==/", 
      "_etag": "\"00000500-0000-0000-0000-567582370000\"", 
      "_attachments": "attachments/" 
   },
	
   { 
      "id": "AndersenFamily", 
      "lastName": "Andersen",
		
      "parents": [ 
         { 
            "firstName": "Thomas", 
            "relationship": "father" 
         },
			
         { 
            "firstName": "Mary Kay", 
            "relationship": "mother" 
         } 
      ],
	  
      "children": [ 
         { 
            "firstName": "Henriette Thaulow", 
            "gender": "female", 
            "grade": 5,
				
            "pets": [ 
               { 
                  "givenName": "Fluffy", 
                  "type": "Rabbit" 
               } 
            ] 
         } 
      ],
	  
      "location": { 
         "state": "WA", 
         "county": "King", 
         "city": "Seattle"
      },
   
      "isRegistered": true, 
      "_rid": "Ic8LAJFujgEEAAAAAAAAAA==", 
      "_ts": 1450541624, 
      "_self": "dbs/Ic8LAA==/colls/Ic8LAJFujgE=/docs/Ic8LAJFujgEEAAAAAAAAAA==/", 
      "_etag": "\"00000700-0000-0000-0000-567582380000\"", 
      "_attachments": "attachments/" 
   } 
]

Chúng ta hãy nhìn vào một example trong số các truy vấn lồng nhau.

Sau đây là truy vấn sẽ lặp lại tất cả các trang gốc và sau đó trả về tài liệu ở đó familyName là Smith.

SELECT * 
FROM p IN Families.parents 
WHERE p.familyName = "Smith"

Khi truy vấn trên được thực thi, nó tạo ra kết quả sau.

[ 
   { 
      "familyName": "Smith", 
      "givenName": "James" 
   } 
]

Hãy xem xét another example của truy vấn lồng nhau.

Sau đây là truy vấn sẽ trả về tất cả familyName.

SELECT VALUE p.familyName
FROM Families f 
JOIN p IN f.parents

Khi truy vấn trên được thực thi, nó tạo ra kết quả theo sau.

[ 
   "Wakefield", 
   "Miller", 
   "Smith", 
   "Curtis" 
]