开发者社区 问答 正文

钉钉易搭 如何实现两个表单数据集间关联查询出A表未出现在B表中的数据

A表为设备信息基础表,B表为巡检表 期望能够得到返回值:每个月巡检漏掉的设备 即A表有B表没有的设备ID数据,且需要按月查询返回。

展开
收起
游客r7f6t5suyqle4 2023-06-13 15:22:09 324 分享 版权
3 条回答
写回答
取消 提交回答
  • 十年摸盘键,代码未曾试。 今日码示君,谁有上云事。

    你可以试一试宜搭视图表功能,视图表通过单表或多表关联,将已有的表单数据进行预处理,同时也支持中间表模式,提升数据加工处理能力。目前,报表数据可视化、表单联动等场景可直接调用视图表中的数据。

    可以在应用配置后台 >> 应用数据 >> 数据集 >> 新建视图表,体验视图表的完整功能。

    数据来源支持单个表单数据、多个表单数据(内关联、左关联)。

    多表数据集:多表数据集,可选取多表内的任意字段,如需添加计算字段,可前往 fx 进行公式定义。可配置关联表、关联关系、关联字段以实现多表关联效果。

    支持创建自定义计算字段。支持按数据按(行级)过滤进行数据过滤。

    2023-06-14 14:37:29
    赞同 1 展开评论
  • 您可以通过钉钉易搭的高级查询功能,使用 SQL 语句实现两个表单数据集间关联查询,以得到 A 表中 B 表没有的设备 ID 数据。

    具体步骤如下:

    1. 在 B 表中创建一个日期字段,用于记录巡检时间。

    2. 在 A 表和 B 表中,各自创建一个公式字段,用于提取日期字段中的月份。假设在 A 表和 B 表中分别创建了名为“月份”的公式字段,公式为 MONTH({日期字段}),其中“日期字段”替换为相应的日期字段。

    3. 在钉钉易搭工作台中,进入 A 表,点击“高级查询”,进入高级查询页面。

    4. 在高级查询页面中,点击“编辑查询条件”,输入 SQL 语句:SELECT * FROM A WHERE ID NOT IN (SELECT ID FROM B),其中“ID”为设备 ID 字段,在实际操作中需要替换为实际的设备 ID 字段名称。

    5. 在 SQL 语句的基础上,添加筛选条件,限定查询日期。假设要查询 2022 年 6 月份的巡检漏掉的设备,可以在 SQL 语句末尾添加条件 AND 月份 = 6 AND {日期字段} >= '2022-06-01' AND {日期字段} <= '2022-06-30',其中“月份”和“日期字段”替换为相应的公式字段名称。这样,就可以得到 2022 年 6 月份中巡检漏掉的设备 ID 数据了。

    需要注意的是,关联查询可能会影响查询效率,建议在数据较少的情况下先测试查询效果,并在实际应用中合理使用索引,以优化查询效率。

    2023-06-13 16:26:15
    赞同 展开评论
  • 全栈JAVA领域创作者

    可以通过以下方法实现:

    在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 != '通过';

    2023-06-13 15:37:12
    赞同 展开评论