A表为设备信息基础表,B表为巡检表 期望能够得到返回值:每个月巡检漏掉的设备 即A表有B表没有的设备ID数据,且需要按月查询返回。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你可以试一试宜搭视图表功能,视图表通过单表或多表关联,将已有的表单数据进行预处理,同时也支持中间表模式,提升数据加工处理能力。目前,报表数据可视化、表单联动等场景可直接调用视图表中的数据。
可以在应用配置后台 >> 应用数据 >> 数据集 >> 新建视图表,体验视图表的完整功能。
数据来源支持单个表单数据、多个表单数据(内关联、左关联)。
多表数据集:多表数据集,可选取多表内的任意字段,如需添加计算字段,可前往 fx 进行公式定义。可配置关联表、关联关系、关联字段以实现多表关联效果。
支持创建自定义计算字段。支持按数据按(行级)过滤进行数据过滤。
您可以通过钉钉易搭的高级查询功能,使用 SQL 语句实现两个表单数据集间关联查询,以得到 A 表中 B 表没有的设备 ID 数据。
具体步骤如下:
在 B 表中创建一个日期字段,用于记录巡检时间。
在 A 表和 B 表中,各自创建一个公式字段,用于提取日期字段中的月份。假设在 A 表和 B 表中分别创建了名为“月份”的公式字段,公式为 MONTH({日期字段})
,其中“日期字段”替换为相应的日期字段。
在钉钉易搭工作台中,进入 A 表,点击“高级查询”,进入高级查询页面。
在高级查询页面中,点击“编辑查询条件”,输入 SQL 语句:SELECT * FROM A WHERE ID NOT IN (SELECT ID FROM B)
,其中“ID”为设备 ID 字段,在实际操作中需要替换为实际的设备 ID 字段名称。
在 SQL 语句的基础上,添加筛选条件,限定查询日期。假设要查询 2022 年 6 月份的巡检漏掉的设备,可以在 SQL 语句末尾添加条件 AND 月份 = 6 AND {日期字段} >= '2022-06-01' AND {日期字段} <= '2022-06-30'
,其中“月份”和“日期字段”替换为相应的公式字段名称。这样,就可以得到 2022 年 6 月份中巡检漏掉的设备 ID 数据了。
需要注意的是,关联查询可能会影响查询效率,建议在数据较少的情况下先测试查询效果,并在实际应用中合理使用索引,以优化查询效率。
可以通过以下方法实现:
在A表中新增一个字段,用于记录B表中已经存在的设备ID,可以使用一个字段表示B表中的设备ID是否已经在A表中存在。 修改B表的查询语句,将B表中的设备ID与A表中的已存在设备ID进行比较,如果A表中不存在该设备ID,则表示该设备漏检了。 具体实现可以参考以下示例代码:
A表:
Copy code CREATE TABLE device_info
( id
int(11) NOT NULL AUTO_INCREMENT COMMENT '设备ID', name
varchar(50) NOT NULL COMMENT '设备名称', ip
varchar(20) NOT NULL COMMENT '设备IP地址', create_time
datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (id
) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='设备信息基础表'; B表:
Copy code CREATE TABLE inspection_record
( id
int(11) NOT NULL AUTO_INCREMENT COMMENT '巡检记录ID', device_id
varchar(50) NOT NULL COMMENT '设备ID', start_time
datetime NOT NULL COMMENT '开始时间', end_time
datetime NOT NULL COMMENT '结束时间', result
varchar(20) NOT NULL COMMENT '巡检结果', PRIMARY KEY (id
) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='巡检表'; 修改B表的查询语句:
Copy code SELECT id
, device_id
, start_time
, end_time
, result
FROM inspection_record
WHERE device_id
NOT IN ( SELECT id
FROM device_info
WHERE name
= 'XXX' -- 每个月要巡检的设备名称 ) AND start_time
BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59' 修改A表中的已存在设备ID字段,并将其与B表进行关联查询:
Copy code ALTER TABLE device_info
ADD COLUMN inspected_id
varchar(50) NOT NULL DEFAULT '' COMMENT '已巡检的设备ID';
UPDATE device_info
SET inspected_id
= ( SELECT id
FROM inspection_record
WHERE device_id
= id
) WHERE name
= 'XXX';
-- 新增查询语句 SELECT id
, name
, ip
, create_time
, inspected_id
, result
FROM device_info
AS d1 LEFT JOIN device_info
AS d2 ON d1.name
= d2.name
AND d1.inspected_id
= d2.inspected_id
LEFT JOIN inspection_record
AS i ON d2.id
= i.device_id
WHERE d1.id
NOT IN ( SELECT id
FROM device_info
WHERE name
= 'XXX' -- 每个月要巡检的设备名称 ) AND i.start_time
BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59' AND i.end_time
BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59' AND i.result
!= '通过';