Sql Teradata-两个表之间的联接-从第一个表获取值

Sql Teradata-两个表之间的联接-从第一个表获取值,sql,join,teradata,Sql,Join,Teradata,假设我有接下来的两张桌子。在第一个例子中,我得到了最可信的信息。第二种方法的信息不太可靠。 其想法是创建第三个表,保存第一个表中的所有信息,并只添加第一个表中没有的字段 初始表 user rank id_best 1 1 'A' 1 2 'P' 1 3 'E' 2 1 'Q' 2 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
                 );

这是一个优先级查询。一种方法使用
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
在至少一个表中是唯一的,则您还可以执行
完全外部联接

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如果确实要创建第三个表,还可以复制初始表,然后将其合并到中间表。

\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
在至少一个表中是唯一的,则您还可以执行
完全外部联接

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如果您确实想要创建第三个表,您也可以复制初始表,然后合并中间表。

您是否可以显示您的代码并指出您的问题所在?您是否考虑过混合交易和分析平台(HTAP)例如,TigerGraph提供了一种更简单、更具表现力的OLAP方法?您能否显示您的代码并指出您的问题所在?您是否考虑过交易和分析平台(HTAP)的混合应用,例如TigerGraph提供了一种更简单、更具表现力的OLAP方法?