PostgreSQL中计算两张表Delta差异的实现方案咨询
实现方法
可以通过**全外连接(FULL OUTER JOIN)**结合条件筛选和字段计算来实现需求,以下是具体的SQL语句:
CREATE TABLE C AS SELECT COALESCE(A.Id, B.Id) AS Id, CASE -- 当B中存在该Id且Value与A不同时,计算B.Value - A.Value WHEN B.Id IS NOT NULL AND A.Value != B.Value THEN B.Value - A.Value -- 当B中不存在该Id时,直接取A的Value WHEN B.Id IS NULL THEN A.Value END AS Value FROM A FULL OUTER JOIN B ON A.Id = B.Id -- 筛选出有差异的记录:要么B不存在,要么Value不等 WHERE B.Id IS NULL OR A.Value != B.Value;
代码解释
FULL OUTER JOIN:关联表A和表B的Id字段,确保能捕获仅存在于A的记录(需求中无仅存在于B的记录,逻辑仍兼容此类场景)。COALESCE(A.Id, B.Id):统一获取记录的Id值,避免因某表无对应记录导致Id为空。CASE语句:根据记录存在场景计算目标Value:- 两表均存在但Value不同时,执行
B.Value - A.Value的差值计算(对应需求中Id2的场景)。 - 仅A存在该Id时,直接复用A的Value值(对应需求中Id3、Id4的场景)。
- 两表均存在但Value不同时,执行
WHERE子句:过滤掉无差异的记录(即两表均存在且Value完全一致的Id1)。
验证示例
假设表A、B的测试数据如下:
表A:
| Id | Value |
|---|---|
| 1 | 10 |
| 2 | 15 |
| 3 | 20 |
| 4 | 25 |
表B:
| Id | Value |
|---|---|
| 1 | 10 |
| 2 | 10 |
执行SQL后生成的表C数据:
| Id | Value |
|---|---|
| 2 | -5 |
| 3 | 20 |
| 4 | 25 |
完全匹配需求要求。
内容的提问来源于stack exchange,提问作者Владимир Дергачев
相关产品推荐
相关产品推荐

