[英]Teradata - Joins between two tables - Mantain values from first table
假設我有接下來的2張桌子。 在第一個中,我擁有最可靠的信息。 第二個信息可靠性較差。 這個想法是創建第三個表,該表保留第一個表中的所有信息,並僅添加第一個表中沒有的那些字段。
初始表
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'
中間表
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'
決賽桌
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
在至少一個表中是唯一的,那么您也可以執行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
是兩個表中的主索引,則這將表現得非常好。 當兩個表具有不同的列時,也可以使用。
#3如果您實際上要創建第三個表,則還可以復制初始表,然后復制MERGE
中間體 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.