JOIN句を使う
JOIN句は、条件に基づいて2つの配列を結合するために使われます。
JOIN句は、FROM句またはUNNEST句の後に使用される必要があります。JOINキーワードの後には、配列を返す式、および条件として使う式を示すONキーワードが続きます:
JOIN expression ON condition_expression
条件は、ブール値を返す単純式か条件式であることが必要です。例:
FROM customers AS c
JOIN orders AS o ON c.custid == o.custid
JOIN句は、FROM句を使うで定義されたASキーワードおよびINDEXキーワードを含めます。
デフォルトでは、JOINキーワードにより内部結合が実行されますが、使用する結合のタイプを指定できます。
- INNER JOIN句は、両方の配列で条件を満たしているアイテムのみを結合します。
- LEFT OUTER JOINは、FROM句またはUNNEST句内にある配列からのアイテムをすべて返し、JOIN句内にある配列からの条件を満たすアイテムを結合します。
たとえば次の入力では:
{
"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"
}
]
}
異なる結合タイプの同じクエリーにより、異なる結果が返されます:
- INNER JOINは順序に関連付けられた顧客のみを返します:
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" } ]
- LEFT OUTER JOINは顧客をすべて返し、顧客に関連付けられた順序がない場合は、orderidエレメントを無視します。
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" } ]
情報メモ注: この例では、条件で使用されるエレメントは両方の配列で同じ名前が付いています。相対パスでの問題を回避するためには、各配列でエイリアスを定義するか、絶対パスを使えばエレメントを参照する必要があります。例:
INNER JOIN orders ON input.customers.custid == input.orders.custid