使用 JOIN 子句根据逻辑关系将来自不同表的数据连接在一起。
语法
SELECT_clause
FROM <left_join_items>
[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER]] JOIN <right_join_items>
ON <join_condition>
[WHERE_clause]
[GROUP_BY_clause]
[HAVING_clause]
[ORDER_BY_clause]
参数
- left_join_items:
FROM 子句中指定的一个或多个表,代表连接的左侧。 - right_join_items:
JOIN 子句中指定的一个或多个表,代表连接的右侧。 - join_condition:
ON 子句中的谓词表达式,使用 = (等于) 比较运算符将连接左侧的列值与连接右侧的列值进行比较。具有与定义的谓词匹配的值的行将使用指定的 连接类型 进行连接。
如果连接的两边都包含同名列,则需要使用完全限定引用来避免歧义。完全限定引用 使用点表示法同时引用表名和列名——例如:table_name.column_name。
连接类型
支持以下连接类型
连接示例表
下面的示例使用以下表说明连接方法
prod_line
| time | station | produced |
|---|
| 2022-01-01T08:00:00Z | B1 | 26 |
| 2022-01-01T09:00:00Z | B1 | 54 |
| 2022-01-01T10:00:00Z | B1 | 56 |
| 2022-01-01T11:00:00Z | B1 | |
| 2022-01-01T12:00:00Z | B1 | 82 |
errors
| time | station | level | message |
|---|
| 2022-01-01T10:00:00Z | B1 | warn | 需要维护 |
| 2022-01-01T11:00:00Z | B1 | crit | 站点离线 |
INNER JOIN
内部连接(INNER JOIN)根据 ON 子句中定义的公共列值,合并连接的左侧和右侧表的行。没有匹配列值的行将不包含在输出表中。
内部连接示例
SELECT
*
FROM
prod_line
RIGHT JOIN errors ON
prod_line.time = errors.time
AND prod_line.station = errors.station
ORDER BY
prod_line.time
内部连接结果
| time | station | produced | time | station | level | message |
|---|
| 2022-01-01T10:00:00Z | B1 | 56 | 2022-01-01T10:00:00Z | B1 | warn | 需要维护 |
| 2022-01-01T11:00:00Z | B1 | | 2022-01-01T11:00:00Z | B1 | crit | 站点离线 |
LEFT [OUTER] JOIN
左外连接(LEFT OUTER JOIN)返回连接左侧的所有行,并且仅在 ON 子句中定义的匹配列值行中返回连接右侧的数据。
左外连接示例
SELECT
*
FROM
prod_line
LEFT JOIN errors ON
prod_line.time = errors.time
AND prod_line.station = errors.station
ORDER BY
prod_line.time
左外连接结果
| time | station | produced | time | station | level | message |
|---|
| 2022-01-01T08:00:00Z | B1 | 26 | | | | |
| 2022-01-01T09:00:00Z | B1 | 54 | | | | |
| 2022-01-01T10:00:00Z | B1 | 56 | 2022-01-01T10:00:00Z | B1 | warn | 需要维护 |
| 2022-01-01T11:00:00Z | B1 | | 2022-01-01T11:00:00Z | B1 | crit | 站点离线 |
| 2022-01-01T12:00:00Z | B1 | 82 | | | | |
RIGHT [OUTER] JOIN
右外连接(RIGHT OUTER JOIN)返回连接右侧的所有行,并且仅在 ON 子句中定义的匹配列值行中返回连接左侧的数据。
右外连接示例
SELECT
*
FROM
prod_line
RIGHT JOIN errors ON
prod_line.time = errors.time
AND prod_line.station = errors.station
ORDER BY
prod_line.time
右外连接结果
| time | station | produced | time | station | level | message |
|---|
| 2022-01-01T10:00:00Z | B1 | 56 | 2022-01-01T10:00:00Z | B1 | warn | 需要维护 |
| 2022-01-01T11:00:00Z | B1 | | 2022-01-01T11:00:00Z | B1 | crit | 站点离线 |
FULL [OUTER] JOIN
全外连接(FULL OUTER JOIN)返回连接的左侧和右侧的所有数据,并合并 ON 子句中定义的匹配列值行。在连接的每一侧不可用的数据将为 NULL。
全外连接示例
SELECT
*
FROM
prod_line
FULL JOIN errors ON
prod_line.time = errors.time
AND prod_line.station = errors.station
ORDER BY
time
全外连接结果
| time | station | produced | time | station | level | message |
|---|
| 2022-01-01T08:00:00Z | B1 | 26 | | | | |
| 2022-01-01T09:00:00Z | B1 | 54 | | | | |
| 2022-01-01T10:00:00Z | B1 | 56 | 2022-01-01T10:00:00Z | B1 | warn | 需要维护 |
| 2022-01-01T11:00:00Z | B1 | | 2022-01-01T11:00:00Z | B1 | crit | 站点离线 |
| 2022-01-01T12:00:00Z | B1 | 82 | | | | |
排查连接问题
对未限定字段的引用含糊不清
如果一个列存在于连接的两侧,并且在 SELECT、ON、WHERE、HAVING、GROUP BY 或 ORDER BY 子句中使用,则必须使用 完全限定引用。例如,如果连接的两侧都有一个 time 列,并且您想显式选择一个时间列,则必须指定要使用哪个侧的时间列。
SELECT
prod_line.time,
produced,
message,
FROM
prod_line
INNER JOIN errors ON
-- ...
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 InfluxDB 3 Core 和本文档提供反馈和错误报告。要获得支持,请使用以下资源
具有年度合同或支持合同的客户可以 联系 InfluxData 支持。