DocumentDB SQL - Join
Nei database relazionali, la clausola Joins viene utilizzata per combinare i record di due o più tabelle in un database e la necessità di unire tra tabelle è molto importante durante la progettazione di schemi normalizzati. Poiché DocumentDB si occupa del modello di dati denormalizzato di documenti senza schema, JOIN in DocumentDB SQL è l'equivalente logico di un "selfjoin".
Consideriamo i tre documenti come negli esempi precedenti.
Di seguito è riportato il file AndersenFamily documento.
{
"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
}
Di seguito è riportato il file SmithFamily documento.
{
"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
}
Di seguito è riportato il file WakefieldFamily documento.
{
"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
}
Diamo un'occhiata a un esempio per capire come funziona la clausola JOIN.
La seguente è la query che unirà la radice al documento secondario.
SELECT f.id
FROM Families f
JOIN c IN f.children
Quando la query precedente viene eseguita, produrrà il seguente output.
[
{
"id": "WakefieldFamily"
},
{
"id": "WakefieldFamily"
},
{
"id": "SmithFamily"
},
{
"id": "SmithFamily"
},
{
"id": "AndersenFamily"
}
]
Nell'esempio precedente, il join è tra la radice del documento e la radice secondaria secondaria che crea un prodotto incrociato tra due oggetti JSON. Di seguito sono riportati alcuni punti da notare:
Nella clausola FROM, la clausola JOIN è un iteratore.
I primi due documenti WakefieldFamily e SmithFamily contengono due figli, quindi il set di risultati contiene anche il prodotto incrociato che produce un oggetto separato per ogni figlio.
Il terzo documento AndersenFamily contiene un solo figlio, quindi esiste un solo oggetto corrispondente a questo documento.
Diamo un'occhiata allo stesso esempio, tuttavia questa volta recuperiamo anche il nome del bambino per una migliore comprensione della clausola JOIN.
La seguente è la query che unirà la radice al documento secondario.
SELECT
f.id AS familyName,
c.givenName AS childGivenName,
c.firstName AS childFirstName
FROM Families f
JOIN c IN f.children
Quando la query precedente viene eseguita, produce il seguente output.
[
{
"familyName": "WakefieldFamily",
"childGivenName": "Jesse"
},
{
"familyName": "WakefieldFamily",
"childGivenName": "Lisa"
},
{
"familyName": "SmithFamily",
"childGivenName": "Michelle"
},
{
"familyName": "SmithFamily",
"childGivenName": "John"
},
{
"familyName": "AndersenFamily",
"childFirstName": "Henriette Thaulow"
}
]