DocumentDB SQL - Tham gia

Trong cơ sở dữ liệu quan hệ, mệnh đề Joins được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều bảng trong cơ sở dữ liệu và nhu cầu kết hợp giữa các bảng là rất quan trọng trong khi thiết kế các lược đồ chuẩn hóa. Vì DocumentDB xử lý mô hình dữ liệu không chuẩn hóa của các tài liệu không có giản đồ, nên JOIN trong DocumentDB SQL tương đương lôgic của một "selfjoin".

Chúng ta hãy xem xét ba tài liệu như trong các ví dụ trước.

Sau đây là AndersenFamily tài liệu.

{ 
   "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 
}

Sau đây là SmithFamily tài liệu.

{ 
   "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 
}

Sau đây là WakefieldFamily tài liệu.

{ 
   "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ụ để hiểu cách hoạt động của mệnh đề JOIN.

Sau đây là truy vấn sẽ kết hợp tài liệu gốc với con.

SELECT f.id 
FROM Families f 
JOIN c IN f.children

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

[ 
   { 
      "id": "WakefieldFamily" 
   },
	
   { 
      "id": "WakefieldFamily" 
   },
	
   { 
      "id": "SmithFamily" 
   },
	
   { 
      "id": "SmithFamily" 
   },
	
   { 
      "id": "AndersenFamily" 
   } 
]

Trong ví dụ trên, phép nối nằm giữa gốc tài liệu và gốc con con tạo nên sản phẩm chéo giữa hai đối tượng JSON. Sau đây là những điểm nhất định cần lưu ý:

  • Trong mệnh đề FROM, mệnh đề JOIN là một trình lặp.

  • Hai tài liệu đầu tiên WakefieldFamily và SmithFamily chứa hai phần tử con, do đó tập kết quả cũng chứa tích chéo tạo ra một đối tượng riêng biệt cho mỗi phần tử con.

  • Tài liệu thứ ba AndersenFamily chỉ chứa một phần tử con, do đó chỉ có một đối tượng duy nhất tương ứng với tài liệu này.

Hãy xem cùng một ví dụ, tuy nhiên lần này chúng ta truy xuất tên con cũng như để hiểu rõ hơn về mệnh đề JOIN.

Sau đây là truy vấn sẽ kết hợp tài liệu gốc với con.

SELECT  
   f.id AS familyName, 
   c.givenName AS childGivenName, 
   c.firstName AS childFirstName 
FROM Families f  
JOIN c IN f.children

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

[ 
   { 
      "familyName": "WakefieldFamily", 
      "childGivenName": "Jesse" 
   },
	
   { 
      "familyName": "WakefieldFamily", 
      "childGivenName": "Lisa" 
   },
	
   { 
      "familyName": "SmithFamily", 
      "childGivenName": "Michelle" 
   },
	
   { 
      "familyName": "SmithFamily", 
      "childGivenName": "John" 
   },
	
   { 
      "familyName": "AndersenFamily", 
      "childFirstName": "Henriette Thaulow" 
   } 
]