簡體   English   中英

Teradata-兩個表之間的聯接-從第一個表保留值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM