如何在Access中创建查询合并站点浓度表与坐标表并保留全量数据
在Access中合并原始数据表与坐标表并保留全部数据的方案
嘿,这个需求太贴合数据库规范化设计的思路了——把重复的坐标信息抽成单独的表,既省空间又方便维护。下面给你两种实现方式,不管你习惯用图形界面还是写SQL都能搞定:
前提准备
首先得确认两个表的Location字段格式完全一致(比如都是文本类型,没有多余空格、大小写差异),这是关联的关键,不然会出现匹配不上的情况。
方式一:用图形化查询设计(适合可视化操作)
- 打开你的Access数据库,点击顶部菜单栏的创建 > 查询设计
- 在弹出的“显示表”窗口里,把「原始数据表」和「坐标表」都添加到查询设计界面,然后关闭窗口
- 拖动「原始数据表」里的
Location字段,到「坐标表」的Location字段上,松开鼠标后会出现一条关联线 - 双击你需要在结果中显示的字段:比如原始数据表的「时间」「Location」「浓度」,坐标表的「Longitude」「Latitude」,这些字段会自动出现在下方的网格里
- 重点来了!右键点击两个表之间的关联线,选择连接属性,在弹出的窗口里选第三个选项:
包括“原始数据表”中的所有记录和“坐标表”中联接字段相等的那些记录——这就是左连接,能保证原始数据的所有记录都被保留,哪怕某个站点的坐标没在坐标表里找到,对应的经纬度会显示为Null,方便你后续排查 - 点击顶部的运行按钮(那个感叹号图标),就能看到合并后的结果了,最后记得给查询起个名字保存起来
方式二:直接写SQL语句(适合快速操作)
如果你熟悉SQL,直接打开查询的SQL视图,粘贴下面的语句(记得把表名和字段名换成你实际的名称):
SELECT 原始数据表.时间, 原始数据表.Location, 原始数据表.浓度, 坐标表.Longitude, 坐标表.Latitude FROM 原始数据表 LEFT JOIN 坐标表 ON 原始数据表.Location = 坐标表.Location;
这条语句的核心是LEFT JOIN,它会保留左边表(原始数据表)的所有记录,右边表(坐标表)中匹配到的记录就显示经纬度,没匹配到的话经纬度字段会是Null。
额外需求:保留两个表的全部数据(全外连接)
如果你还想保留坐标表中所有站点的信息(哪怕某个站点还没有采集到浓度数据),那需要用全外连接。Access的图形界面没有直接的全外连接选项,不过可以用UNION来实现,SQL语句如下:
SELECT 原始数据表.时间, 原始数据表.Location, 原始数据表.浓度, 坐标表.Longitude, 坐标表.Latitude FROM 原始数据表 LEFT JOIN 坐标表 ON 原始数据表.Location = 坐标表.Location UNION SELECT 原始数据表.时间, 坐标表.Location, 原始数据表.浓度, 坐标表.Longitude, 坐标表.Latitude FROM 坐标表 LEFT JOIN 原始数据表 ON 坐标表.Location = 原始数据表.Location;
这样不管原始数据有没有记录,坐标表的所有站点都会显示出来,没有数据的字段会显示为Null。
内容的提问来源于stack exchange,提问作者Phoenix Ning
相关产品推荐
相关产品推荐

