La clause JOIN
est utilisée pour effectuer une jointure sur deux collections, en respectant une condition.
La clause
JOIN
doit être utilisée après une clause FROM
ou UNNEST
. Le mot-clé JOIN
est suivi de l'identfiant et du mot-clé ON
introduisant l'expression à utiliser comme condition :JOIN identifier ON expression
La condition doit être une expression simple ou conditionnelle retournant un booléen. Par exemple :
FROM customers AS c
JOIN orders AS o ON c.custid == o.custid
La clause JOIN
peut contenir les mots-clés AS
et INDEX
décrits dans Utiliser la clause FROM.
Par défaut, le mot-clé
JOIN
effectue une jointure interne, mais vous pouvez spécifier le type de jointure à utiliser :- La clause
INNER JOIN
effectue une jointure uniquement sur les éléments respectant la condition dans les deux collections. - La jointure externe à gauche
LEFT OUTER JOIN
retourne tous les éléments de la collection dans la clauseFROM
ouUNNEST
et effectue une jointure sur les éléments de la collection dans la clauseJOIN
respectant la condition.
Par exemple, avec l'entrée suivante :
{
"customers": [
{
"custid": "1234",
"name": "Jack Smith"
},
{
"custid": "5678",
"name": "Jane Smith"
},
{
"custid": "9874",
"name": "John Doe"
}
],
"orders": [
{
"orderid": "abc-6511",
"custid":"1234"
},
{
"orderid": "def-6872",
"custid":"5678"
}
]
}
La même requête avec un type de jointure différent retourne des résultats différents :
- La jointure interne
INNER JOIN
retourne uniquement les client·es associé·es à une commande :FROM customers AS c INNER JOIN orders AS o ON c.custid == o.custid SELECT { name, orderid }
[ { "name":"Jack Smith", "orderid":"abc-6511" }, { "name":"Jane Smith", "orderid":"def-6872" } ]
- La jointure externe à gauche
LEFT OUTER JOIN
retourne tous les client·es et ignore l'élémentorderid
lorsqu'aucune commande n'est associée au client ou à la cliente :FROM customers AS c LEFT OUTER JOIN orders AS o ON c.custid == o.custid SELECT { name, orderid }
[ { "name":"Jack Smith", "orderid":"abc-6511" }, { "name":"Jane Smith", "orderid":"def-6872" }, { "name":"John Doe" } ]
Remarque : Dans cet exemple, les éléments utilisés dans la condition ont le même nom dans les deux collections. Pour éviter les problèmes avec les chemins relatifs, vous devez définir un alias pour chaque collection ou utiliser des chemins absolus pour faire référence à l'élément. Par exemple :
INNER JOIN orders ON input.customers.custid == input.orders.custid