跨模查询
跨模查询是一种用于检索相关联数据的查询方法,通常用于在不同类型的数据库之间进行查询,例如在关系数据库和时序数据库之间检索相关的数据。
KWDB 跨模查询支持对关系表和时序表进行关联查询、嵌套查询、联合查询。
KWDB 跨模查询支持以下关联查询:
- 内连接(INNER JOIN)
- 左连接(LEFT JOIN)
- 右连接(RIGHT JOIN)
- 全连接(FULL JOIN)
KWDB 跨模查询支持以下嵌套查询:
- 相关子查询(Correlated Subquery):内部查询依赖于外部查询的结果,每次外部查询的都触发内部查询的执行。
- 非相关子查询(Non-Correlated Subquery):内部查询独立于外部查询,只执行一次内部查询并返回固定的结果。
- 相关投影子查询(Correlated Scalar Subquery): 内部查询依赖于外部查询的结果,并且只返回一个单一的值作为外部查询的结果。
- 非相关投影子查询(Non-Correlated Scalar Subquery):内部查询独立于外部查询,并且只返回一个单一的值作为外部查询的结果。
FROM
子查询:将一个完整的 SQL 查询嵌套在另一个查询的FROM
子句中,作为临时表格使用。
KWDB 跨模查询支持以下联合查询:
- UNION:合并多个查询结果集,并去除重复行。
- UNION ALL:合并多个查询结果集,但不去除重复行。
- INTERSECT:返回两个查询结果集中都存在的所有行,去除重复行。
- INTERSECT ALL:返回两个查询结果集中都存在的所有行,但不去除重复行。
- EXCEPT:返回第一个查询结果集中不包含在第二个结果集中的行,去除重复行。
- EXCEPT ALL:返回第一个查询结果集中不包含在第二个结果集中的行,不去除重复行。
说明
- KWDB 支持显式事务内执行时序数据的查询以及写入,但不保证时序引擎的事务性,也不保证跨模查询结果的一致性。
- 使用
FULL JOIN
时,避免在连接条件中使用子查询。
前提条件
用户拥有目标表的 SELECT 权限。
语法示例
以下示例假设已创建 tsdb
时序数据库、rdb
关系数据库、关系表 DeviceModel
和 Device
、时序表 MonitoringCenter
并写入相关数据。
关联查询
以下示例通过内连接将
Device
、DeviceModel
、MonitoringCenter
表关联在一起,获取特定条件下的设备信息和相关型号与监控中心信息。SELECT d.deviceID, dm.TypeName, dm.ModelName FROM rdb.Device AS d INNER JOIN rdb.DeviceModel AS dm ON d.modelID = dm.modelID INNER JOIN tsdb.MonitoringCenter AS mc ON d.deviceID = mc.deviceID WHERE mc.status = -1 ORDER BY d.deviceID; deviceid | typename | modelname -----------+----------+-------------- 7 | 电表 | 电表模型2 16 | 变压器 | 变压器模型6 (2 rows)
嵌套查询
以下示例使用相关投影子查询,对设备 ID 与
tsdb.MonitoringCenter
的表进行关联,返回相应设备 ID 下的最新状态。SELECT d.deviceID, (SELECT MAX(status) FROM tsdb.MonitoringCenter WHERE deviceID = d.deviceID) AS LatestStatus FROM rdb.Device AS d ORDER by d.deviceID; deviceid | lateststatus -----------+--------------- 1 | NULL 2 | 0 3 | NULL 4 | NULL 5 | NULL 6 | NULL 7 | -1 8 | NULL 9 | NULL 10 | NULL 11 | NULL 12 | NULL 13 | NULL 14 | 0 15 | NULL 16 | -1 17 | NULL 18 | 0 19 | NULL 20 | NULL 21 | NULL (21 rows)
联合查询
以下示例使用
UNION
操作符合并rdb.Device
和tsdb.MonitoringCenter
表的查询结果,并将最终结果以deviceID
和status
进行升序排序。SELECT deviceID, NULL AS status FROM rdb.Device UNION SELECT NULL AS deviceID, status FROM tsdb.MonitoringCenter order by deviceID,status; deviceid | status -----------+--------- NULL | -1 NULL | 0 1 | NULL 2 | NULL 3 | NULL 4 | NULL 5 | NULL 6 | NULL 7 | NULL 8 | NULL 9 | NULL 10 | NULL 11 | NULL 12 | NULL 13 | NULL 14 | NULL 15 | NULL 16 | NULL 17 | NULL 18 | NULL 19 | NULL 20 | NULL 21 | NULL (23 rows)