【问题标题】:SQL conditional join TeradataSQL 条件连接 Teradata
【发布时间】:2020-05-19 00:09:27
【问题描述】:

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

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

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

表 T1 ID MonA 数据 一个 2 BBB 一个 3 CCC B 4 DDD B 5 电子电气设备 B 11 电子电气设备 表 T2 ID MonB 器官 一个 3 肝 B 5 心 B 7 肾脏

这是,结果应该是什么样子的

ID MonA MonB 数据机构 A 3 3 CCC 肝脏 B 5 5 EEE 心脏 B 11 7 EEE 肾脏

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

编辑:可能是多个具有相同 ID 的条目,MonA=MonB,但不同的 Data/Organ 列,我希望它们都在结果表中。

【问题讨论】:

    标签: sql join teradata


    【解决方案1】:

    让 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*/
    

    【讨论】:

    • K,我到了。我发现我的方法中的第一个错误是对 MonA 和 MonB 使用分区和降序,当它们具有不同的覆盖集时会导致问题。工会仍然存在一些问题(不兼容的选择列表),但我会继续努力。后来。
    • 完美运行,非常感谢!我并没有真正没有联合方法(仍在学习SQL),这个想法真的很好!
    • 简短说明:我将窗口/分区移动到连接条件中 - 使联合更容易,因为您不必单独选择列。
    【解决方案2】:

    这应该会返回预期的结果:

    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
    

    【讨论】:

    • 我会尝试分区内的大小写是否有效。但是,当 t2 有更多的列都需要包含在内时,您将如何使用分区,为什么 t2.organ 在分区中?谢谢帮忙!
    • 您可以简单地将 ANDed 条件添加到 WHEN。并且 t2.organ 被添加到 PARTITION 因为您希望返回 t2 中的所有行(应该由唯一的列组合分区)
    • 你好,多尼斯。考虑到 t2 有更多的列,是否有任何避免在“分区依据”行中明确命名所有?在上面的解决方案中,我可以简单地使用“select *”...如果有解决方案,我会立即试一试。看起来非常漂亮和干净!
    • 我的意思是“避免全部枚举”,无法再更改编辑。
    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 2017-12-31
    • 2013-05-18
    • 2014-12-25
    • 2011-03-29
    • 2023-04-10
    相关资源
    最近更新 更多