多表关联:连接、追加、查找匹配
台账对系统账,找出两边对不上的记录。这一讲把数据合并里最绕的三个问题讲透:四种连接类型差在哪、匹配不上时该查什么、行数为什么会变多。
这一讲接着第 4 讲往下做。第 4 讲教的类型转换和字符串处理,在这一讲会变成硬需求 – 关联失败的原因大半出在 key 没洗干净。
数据合并的第一步:分清「连接」和「关联」
数据合并有两种完全不同的做法,对应两个名字接近的节点,这也是这套教程里最容易用错的一对。第 3 讲已经预告过,这里正式讲清楚。
演示会自动播放。鼠标移上去暂停,点任意按钮转为手动,点右上角可以全屏投影。
一句话记:要更多行用连接,要更多列用关联。拿不准的时候,先问自己「结果应该有几行、几列」,答案立刻就出来了。
四种连接类型,区别只在一件事
关联节点的配置里最重要的就是连接类型。它决定的只有一件事:匹配不上的行,留还是不留。
| 类型 | 留什么 | 什么时候用 |
|---|---|---|
| 内连接 | 只留两边都能对上的 | 确定两边一定能对上时。做对账千万别用 |
| 左外连接 | 左表全留,右表对不上就补空 | 找「台账有、系统没有」的资产 |
| 右外连接 | 右表全留,左表对不上就补空 | 找「系统有、台账没有」的资产 |
| 全外连接 | 两边的行一个不丢 | 做对账就用它,三类差异一次出全 |
内连接是这一讲最危险的默认值。它会把匹配不上的行静悄悄丢掉,不报错、不警告、节点还是绿灯。用它做对账,等于把要找的差异全扔了 – 而你会以为「两边完全一致」。
对账的标准做法
用全外连接跑一次,得到一张包含全部差异的表,然后用第 2 讲的行过滤器分三次筛:
- 系统数量为空 → 台账里有,系统里漏登记了
- 台账数量为空 → 系统里有,台账上漏登记了
- 两个都有但不相等 → 数量对不上,需要核实
这三类差异对应三种完全不同的处理动作,所以要分开筛、分开交。一张混在一起的差异表,接手的人不知道该干什么。
明明有,却一行都匹配不上
这是关联最高频的故障:两张表里都能看到 12000008,内连接跑出来却是 0 行。节点绿灯,控制台干净。
照这个顺序查,十分钟能定位
- 类型不一致。一张表里编号是整数(标记 I),另一张是字符串(标记 S)。人眼看着一样,系统认为不是一个东西。用第 4 讲的类型转换统一成同一种。
- 看不见的空格。系统导出的编号尾部常带一个空格,屏幕上完全看不出来。关联前对 key 做一次
strip,成本几乎为零。 - 格式不统一。一边是
FA-12000008-SZ,一边是12000008。用第 4 讲的字符串处理把 key 洗成同一种样子,再拿洗过的那一列做连接列。
建议养成的习惯:关联之前,先给两边的 key 都加一道去空格 + 统一类型。两个节点的事,能省掉后面大量的莫名其妙。
关联之后,行数怎么反而变多了
台账 3 行、领用记录 4 行,关联出来 6 行。这不是节点坏了,是关联的正常行为:结果行数 = 左边匹配上的行数 × 右边匹配上的行数。
一台设备被领用过三次,右表就有三行,左表那一行会被复制成三行。这在业务上是对的 – 一对多本来就该展开。真正危险的是你以为 key 唯一,其实不唯一:几万行的表一乘,能变成几百万行,内存直接吃满。
学完自检
- 分得清连接(更多行)和关联(更多列),不会再用错
- 知道内连接会静悄悄丢掉匹配不上的行,做对账用全外连接
- 能用全外连接跑一次,再分三次筛出三类差异
- 匹配不上时会按「类型 → 空格 → 格式」的顺序排查
- 关联后会核行数,知道行数暴涨意味着 key 有重复

