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
中级.
假设我有接下来的 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
中级.