DocumentDB SQL - Birleştirmeler

İlişkisel veritabanlarında, Joins yan tümcesi, bir veritabanındaki iki veya daha fazla tablodaki kayıtları birleştirmek için kullanılır ve normalleştirilmiş şemalar tasarlanırken tablolar arasında birleştirme ihtiyacı çok önemlidir. DocumentDB, şemasız belgelerin normal olmayan veri modeliyle ilgilendiğinden, DocumentDB SQL'deki JOIN, "selfjoin" in mantıksal eşdeğeridir.

Üç belgeyi önceki örneklerdeki gibi ele alalım.

Aşağıdaki AndersenFamily belge.

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

Aşağıdaki SmithFamily belge.

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

Aşağıdaki WakefieldFamily belge.

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

JOIN cümlesinin nasıl çalıştığını anlamak için bir örneğe bakalım.

Aşağıda, kökü alt belgeye katacak sorgu yer almaktadır.

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

Yukarıdaki sorgu yürütüldüğünde aşağıdaki çıktıyı üretecektir.

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

Yukarıdaki örnekte, birleştirme, belge kökü ile iki JSON nesnesi arasında bir çapraz ürün oluşturan alt alt kök arasındadır. Aşağıda dikkat edilmesi gereken bazı noktalar verilmiştir -

  • FROM yan tümcesinde, JOIN yan tümcesi bir yineleyicidir.

  • İlk iki belge WakefieldFamily ve SmithFamily iki çocuk içerir, dolayısıyla sonuç kümesi ayrıca her çocuk için ayrı bir nesne üreten çapraz çarpımı da içerir.

  • Üçüncü belge AndersenFamily yalnızca bir çocuk içerir, dolayısıyla bu belgeye karşılık gelen yalnızca tek bir nesne vardır.

Aynı örneğe bir göz atalım, ancak bu sefer JOIN cümlesini daha iyi anlamak için çocuk adını da alıyoruz.

Aşağıda, kökü alt belgeye katacak sorgu yer almaktadır.

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

Yukarıdaki sorgu yürütüldüğünde aşağıdaki çıktıyı üretir.

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