SQL 条件加入 Teradata

SQL conditional join Teradata

我正在尝试在 T1.id=T2.id、T1.MonA=T2.MonB 上加入以下两个 tables T1 和 T2,这样

  1. 每当 MonA=MonB(现在可以在两个 table 中找到一个条目), 执行普通连接。 ID A的实例就是这种情况, MonA=MonB=3
  2. 如果 MonB 条目在 table T2 中,但在中找不到相同的 MonA 条目 Table T1,连接应取自 table T1 MonA 所在的行 最大。在示例 table 中,最后两行都是这种情况。
  3. 不在 T2 中的来自 T1 的 MonA 将被忽略

条件T1.id=T2.id是一个必要的前提条件,所以这总是需要为真!

Table T1
ID            MonA     Data
A             2        BBB
A             3        CCC
B             4        DDD
B             5        EEE
B             11       EEE
Table T2
ID            MonB     Organ
A             3        Liver
B             5        Heart
B             7        Kidney

结果应该是这样的

ID       MonA    MonB    Data       Organ
A        3       3       CCC        Liver
B        5       5       EEE        Heart
B        11      7       EEE        Kidney

我需要在 Teradata SQL 中执行此操作,老实说目前不知道如何解决该问题。感谢您的帮助!

编辑:可能有多个条目具有相同的 ID,MonA=MonB,但 Data/Organ 列不同,我希望所有条目都在结果 table.

让我们按如下方式连接 t1 和 t2

--gets all of the matching records by (id,mona) pairs from t1 with (id,monb) from t2
select a.id,a.mona,b.monb,a.data,b.organ
  from t1 a
  join t2 b
    on a.id=b.id
   and a.mona=b.monb
union all /*Here you want only from t2 not there in t1 by id*/
   select b.id,x.mona,b.monb,x.data,b.organ
     from t2 b
left join t1 a
       on a.id=b.id
      and a.mona=b.monb
left join (select row_number() over(partition by id order by mona desc) as rnk
                  ,id
                  ,mona
                  ,data
             from t1 
           )x
       on b.id=x.id
      and x.rnk=1 /*pick up only the largest values arranged by mona*/
    where a.mona is null /*Gets only the missing records from t2 which are not in t1*/

这应该return预期结果:

SELECT t1.id,t1.mona,t2.monb,t1.data,t2.organ
  FROM t1
  JOIN t2
    ON t1.id=t2.id
QUALIFY
   Row_Number() 
   Over (PARTITION BY t2.id, t2.organ 
                  -- prefer same entry in both tables
         ORDER BY CASE WHEN t1.mona = t2.monb THEN 1 ELSE 2 END
                  -- otherwise take max monA
                  ,t1.mona DESC -- ) = 1