La clause JOIN
est utilisée pour effectuer une jointure sur deux tableaux, en respectant une condition.
La clause
JOIN
doit être utilisée après une clause FROM
ou UNNEST
. Le mot-clé JOIN
est suivi d'une expression retournant un tableau et du mot-clé ON
introduisant l'expression à utiliser comme condition :JOIN expression ON condition_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 tableaux. - La jointure externe à gauche
LEFT OUTER JOIN
retourne tous les éléments du tableau dans la clauseFROM
ouUNNEST
et effectue une jointure sur les éléments du tableau 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 tableaux. Pour éviter les problèmes avec les chemins relatifs, vous devez définir un alias pour chaque tableau 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