加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 在填充值时合并两个版本跟踪表

发布时间:2020-12-12 06:34:39 所属栏目:MsSql教程 来源:网络整理
导读:我有两个跟踪数据库值更改的历史记录表,使用修订ID来跟踪各个更改.例如 表格1: rev | A | B ================= 1 | 100 | 'A' 4 | 150 | 'A' 7 | 100 | 'Z' 表2: rev | C | D ================== 1 | 200 | True 5 | 0 | True 8 | 0 | False 目标是将两个表
我有两个跟踪数据库值更改的历史记录表,使用修订ID来跟踪各个更改.例如

表格1:

rev |  A   |  B 
=================
 1   |  100 | 'A'
 4   |  150 | 'A'
 7   |  100 | 'Z'

表2:

rev |  C   |  D 
==================
 1   |  200 | True
 5   |    0 | True
 8   |    0 | False

目标是将两个表合并为:

rev |  A   |  B  |  C  |  D 
===============================
 1   |  100 | 'A' | 200 | True
 4   |  150 | 'A' | 200 | True
 5   |  150 | 'A' |   0 | True
 7   |  100 | 'Z' |   0 | True
 8   |  100 | 'Z' |   0 | False

这个想法是,对于给定的修订,我会采用与该修订相对应的值或者低于它的最高修订版.

想到的SQL查询类似于使用约束rev1<交叉连接两个表. rev2,然后使用子查询选择行,其中rev1 = max(rev1)为每个给定的rev2;将此查询与其对应方交换rev2和rev1;最后过滤掉rev1 = rev2的副本. 问题是:
>这种类型的加入是否有名称?
>在SQL中是否有用于执行此类连接的习惯用法,或者以编程方式执行此操作会更好(这肯定会更简单,也可能更高效)?

解决方法

SQL Fiddle
select
    coalesce(t1.rev,t2.rev) rev,coalesce(a,lag(a,1) over(order by coalesce(t2.rev,t1.rev))) a,coalesce(b,lag(b,t1.rev))) b,coalesce(c,lag(c,1) over(order by coalesce(t1.rev,t2.rev))) c,coalesce(d,lag(d,t2.rev))) d
from
    t1
    full join
    t2 on t1.rev = t2.rev
order by rev

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读