В реляционных базах данных предложение Joins используется для объединения записей из двух или более таблиц в базе данных, и необходимость объединения разных таблиц очень важна при разработке нормализованных схем. Поскольку DocumentDB имеет дело с денормализованной моделью данных документов без схемы, JOIN в DocumentDB SQL является логическим эквивалентом «self-join».
Давайте рассмотрим три документа, как в предыдущих примерах.
Ниже приводится документ AndersenFamily .
{ "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 .
{ "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 .
{ "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.
Ниже приведен запрос, который присоединит корневой дочерний документ.
SELECT f.id FROM Families f JOIN c IN f.children
Когда вышеуказанный запрос будет выполнен, он выдаст следующий вывод.
[ { "id": "WakefieldFamily" }, { "id": "WakefieldFamily" }, { "id": "SmithFamily" }, { "id": "SmithFamily" }, { "id": "AndersenFamily" } ]
В приведенном выше примере соединение происходит между корневым каталогом документа и дочерним корневым каталогом, что создает перекрестный продукт между двумя объектами JSON. Ниже приведены некоторые моменты, на которые следует обратить внимание:
-
В предложении FROM предложение JOIN является итератором.
-
Первые два документа WakefieldFamily и SmithFamily содержат двух дочерних элементов, поэтому набор результатов также содержит перекрестный продукт, который создает отдельный объект для каждого дочернего элемента.
-
Третий документ AndersenFamily содержит только одного потомка, следовательно, этому документу соответствует только один объект.
В предложении FROM предложение JOIN является итератором.
Первые два документа WakefieldFamily и SmithFamily содержат двух дочерних элементов, поэтому набор результатов также содержит перекрестный продукт, который создает отдельный объект для каждого дочернего элемента.
Третий документ AndersenFamily содержит только одного потомка, следовательно, этому документу соответствует только один объект.
Давайте посмотрим на тот же пример, однако на этот раз мы также извлекаем дочернее имя для лучшего понимания предложения JOIN.
Ниже приведен запрос, который присоединит корневой дочерний документ.
SELECT f.id AS familyName, c.givenName AS childGivenName, c.firstName AS childFirstName FROM Families f JOIN c IN f.children
Когда вышеуказанный запрос выполняется, он производит следующий вывод.