Teradata - 在两个 table 之间加入 - 从第一个 table 开始维护值

Teradata - Joins between two tables - Mantain values from first table

假设我有接下来的 2 tables。在第一个中,我拥有最可信的信息。第二个的信息不太可靠。 我们的想法是创建第三个 table,保留第一个的所有信息,并仅添加第一个没有的字段。

初始table

       user    rank   id_best
        1       1       'A'
        1       2       'P'
        1       3       'E' 
        2       1       'Q'
        2       2       'E'
        3       1       'P'
        3       2       'O'
        3       3       'C'

中级 table

       user    rank   id_best
        1       1       'B'
        1       2       'D'
        1       3       'R'
        1       4       'Q' 
        1       5       'W'  
        2       1       'T'
        2       2       'Y'
        2       3       'S'
        2       4       'Q'
        2       5       'E'
        3       1       'Y'
        3       2       'E'
        3       3       'S'
        3       4       'A'
        3       5       'T'

决赛table

       user    rank   id_best
        1       1       'A'
        1       2       'P'
        1       3       'E'
        1       4       'Q' 
        1       5       'W'  
        2       1       'Q'
        2       2       'E'
        2       3       'S'
        2       4       'Q'
        2       5       'E'
        3       1       'P'
        3       2       'O'
        3       3       'C'
        3       4       'A'
        3       5       'T'

这是一个优先查询。一种方法使用 union all 逻辑,如下所示:

select o.*
from original o
union all
select i.*
from intermediate i
where not exists (select 1
                  from original o
                  where o.user = i.user and o.rank = i.rank
                 );

#1 使用 OLAP 函数的另一种解决方案:

select *
from
 (
   select 1 as flag, o.*
   from original o
   union all
   select 2, i.*
   from intermediate i
 ) as dt
qualify
   row_number()
   over (partition by user, rank
         order by flag) = 1 --prefer table 1 over table 2

#2 如果 user/rank 在至少一个 table 中是唯一的,你也可以做一个 full outer join:

select 
  coalesce(o.user, i.user),
  coalesce(o.rank, i.rank),
  coalesce(o.id_best, i.id_best)
from original o
full join intermediate i
  on o.user = i.user
 and o.rank = i.rank

如果 user/rank 是两个 table 中的主索引,这将执行得非常好。当 table 有不同的列时也适用。

#3 如果你真的想创建第三个 table 你也可以复制 initial table 然后 MERGE 中级.