流表 JOIN 元数据增强
# 流表 JOIN 元数据增强
# 业务场景
设备上报的读数流里只有 deviceId 和测量值,没有设备的位置、型号等属性。这些属性相对稳定,存在一张"元数据表"里。要求:每条读数到达时,用 deviceId 关联元数据表,把位置/型号补到读数上一并输出(流表 JOIN,stream-table join)。
# SQL
SELECT deviceId,
m.location,
m.model,
temperature
FROM stream JOIN meta m ON deviceId = m.deviceId
1
2
3
4
5
2
3
4
5
# 输入
设备读数流(stream):
{"deviceId": "d1", "temperature": 31.0}
{"deviceId": "d2", "temperature": 27.5}
{"deviceId": "d9", "temperature": 40.0}
1
2
3
2
3
元数据表(meta,用 RegisterTable("meta", rows) 注册):
{"deviceId": "d1", "location": "plantA", "model": "TX-100"}
{"deviceId": "d2", "location": "plantB", "model": "TX-200"}
1
2
2
# 输出
{"deviceId": "d1", "location": "plantA", "model": "TX-100", "temperature": 31.0}
{"deviceId": "d2", "location": "plantB", "model": "TX-200", "temperature": 27.5}
1
2
2
d9 在元数据表里没有匹配,默认 INNER JOIN 被丢弃。
# 行为说明
- 默认 INNER JOIN:元数据表无匹配的读数被丢弃(如
d9)。需要保留无匹配读数时用LEFT JOIN,未命中的表字段为nil。 - JOIN 在 WHERE 之前执行,所以
WHERE、GROUP BY、聚合都能引用 JOIN 进来的表字段(如GROUP BY m.location)。 RegisterTable必须在Execute之后调用:先Execute(sql),再ssql.RegisterTable("meta", []map[string]any{...}),否则 JOIN 找不到表、全部读数被丢弃。- 表别名
m,匹配列写ON deviceId = m.deviceId(流字段不加别名,表字段用m.xxx)。 - 元数据表是"静态维度表",适合设备/用户/产品属性这类低频变更数据;高频变更维表可在节点侧定时刷新。
如何运行
JOIN 查询是非聚合查询,用 EmitSync 同步拿结果;注意 Execute 之后要用 RegisterTable 注册元数据表。完整样板见如何运行案例 SQL。
# 📚 相关文档
- 如何运行案例 SQL
- SQL 参考 —— JOIN 语法
- API 参考 ——
RegisterTable
在 GitHub 上编辑此页 (opens new window)
上次更新: 2026/07/11, 04:40:00