文档文档

JOIN 子句

使用 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:00ZB126
2022-01-01T09:00:00ZB154
2022-01-01T10:00:00ZB156
2022-01-01T11:00:00ZB1
2022-01-01T12:00:00ZB182
errors (错误)
time (时间)station (站点)level (级别)message (消息)
2022-01-01T10:00:00ZB1warn (警告)Maintenance required (需要维护)
2022-01-01T11:00:00ZB1crit (严重)Station offline (站点离线)

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:00ZB1562022-01-01T10:00:00ZB1warn (警告)Maintenance required (需要维护)
2022-01-01T11:00:00ZB12022-01-01T11:00:00ZB1crit (严重)Station offline (站点离线)

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:00ZB126
2022-01-01T09:00:00ZB154
2022-01-01T10:00:00ZB1562022-01-01T10:00:00ZB1warn (警告)Maintenance required (需要维护)
2022-01-01T11:00:00ZB12022-01-01T11:00:00ZB1crit (严重)Station offline (站点离线)
2022-01-01T12:00:00ZB182

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:00ZB1562022-01-01T10:00:00ZB1warn (警告)Maintenance required (需要维护)
2022-01-01T11:00:00ZB12022-01-01T11:00:00ZB1crit (严重)Station offline (站点离线)

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:00ZB126
2022-01-01T09:00:00ZB154
2022-01-01T10:00:00ZB1562022-01-01T10:00:00ZB1warn (警告)Maintenance required (需要维护)
2022-01-01T11:00:00ZB12022-01-01T11:00:00ZB1crit (严重)Station offline (站点离线)
2022-01-01T12:00:00ZB182

排查连接问题

对非限定字段的模糊引用

如果列在连接的双方都存在,并且在 SELECTONWHEREHAVINGGROUP BYORDER BY 子句中使用,则必须使用完全限定的引用。例如,如果连接的双方都有一个 time 列,并且您想显式选择一个 time 列,则必须指定要使用连接哪一侧的 time 列

SELECT
  prod_line.time,
  produced,
  message,
FROM
  prod_line
INNER JOIN errors ON
  -- ...

此页内容是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在这样使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开发布 Alpha 版

InfluxDB 3 开源版本现已可用于 Alpha 测试,根据 MIT 或 Apache 2 许可授权。

我们正在发布两个产品作为 Alpha 版本的一部分。

InfluxDB 3 Core 是我们新的开源产品。它是一个用于时间序列和事件数据的最新数据引擎。InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、读取副本、高可用性、可扩展性和细粒度的安全性。

有关如何开始使用的更多信息,请查看