Apache IoTDB中 ALL子查询的令人困惑的行为

编程语言 2026-07-09

我在Apache IoTDB 2.0.6的表模型中对查询使用ALL语法,但返回的结果与预期不一致。

最小可复现数据

  CREATE TABLE main_data (
  `time` TIMESTAMP `TIME`,
  device_id STRING TAG,
  value INT32 FIELD
  );

  CREATE TABLE detail_data (
  device_id STRING TAG,
  ref_value INT32 FIELD
  );

  INSERT INTO main_data VALUES
  (2024-01-01T00:00:00, 'D1', 30),
  (2024-01-01T01:00:00, 'D1', 40),
  (2024-01-01T02:00:00, 'D1', 50);

  INSERT INTO detail_data VALUES
  (2024-01-01T00:00:00, 'D1', 30),
  (2024-01-01T01:00:00, 'D1', 40),
  (2024-01-02T00:00:00, 'D1', `NULL`);

查询语句

  SELECT * FROM main_data
  WHERE device_id = 'D1'
  AND value > ALL (SELECT ref_value FROM detail_data WHERE device_id = 'D1');

返回结果

  +----+---------+-----+
  |`time`|device_id|value|
  +----+---------+-----+
  +----+---------+-----+
  Empty set.

遇到的问题

在比较50 > ALL(30, 40, NULL) 时,没有返回任何结果。

我期望的行为是:忽略 NULL 的值,并返回如下结果:

  +-----------------------------+----------+-------+
  | `time`| device_id| value|
  +-----------------------------+----------+-------+
  |2024-01-01T02:00:00.000+08:00| D1| 50|
  +-----------------------------+----------+-------+

问题

在进行比较时,应该如何调整SQL以忽略 NULL 的值?

解决方案

只不要与包含这些 NULL 值的行进行比较:

SELECT * FROM main_data
WHERE device_id = 'D1'
AND value > ALL (SELECT ref_value FROM detail_data WHERE device_id = 'D1' AND ref_value IS NOT NULL);
--                                                                            ^^^^^^^^^^^^^^^^^^^^^
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章