1

我基于名为 acc_id 的列加入两个表(帐户、地址)

地址表有时有多个与 acc_id 关联的地址,它们通过类型列进行区分,该列标记地址是主地址还是辅助地址。

我想加入 acc_id 上的两个表,地址表的列在结果中应该如下:

  • 如果没有地址,则为空
  • 如果存在 1 个地址,则该地址的列
  • 如果存在 2 个地址,则主地址的列

如何在 (Teradata-)SQL 中执行此操作?

4

2 回答 2

2

案例陈述可能对您有用!

  • 在“地址”表上进行两次左连接。
  • 加入条件之一应该是“主要”地址
  • 另一个用于辅助地址。
  • case 语句首先检查主地址
  • 如果一个不存在
  • 然后选择辅助地址。
  • 由于left outer join如果两者都不存在则使用 a ,因此该值将显示为NULL
      SELECT DISTINCT a.acc_id
           , 情况下primary_add.acc_id 不为空
                  那么primary_add.address
                  ELSE secondary_add.address
             结束地址
           , 情况下primary_add.acc_id 不为空
                  那么primary_add.city
                  ELSE secondary_add.city
             结束城市
           , 情况下primary_add.acc_id 不为空
                  那么primary_add.state
                  ELSE secondary_add.state
             结束状态
           , 情况下primary_add.acc_id 不为空
                  然后primary_add.zip
                  ELSE secondary_add.zip
             结束拉链
           , 情况下primary_add.acc_id 不为空
                  那么primary_add.address_type
                  ELSE secondary_add.address_type
             END 地址类型
          ------------------------------------------------
         FROM 帐户作为
          ------------------------------------------------
         LEFT OUTER JOIN 地址 AS primary_add
           ON a.acc_id = primary_add.acc_id
              AND address_type = '主要'
          ------------------------------------------------
         LEFT OUTER JOIN 地址 AS secondary_add
           ON a.acc_id = secondary_add.acc_id
              AND address_type = '次要'
于 2013-05-23T13:22:56.427 回答
2

这是一个更简单的 Teradata 解决方案:

SELECT   a.acc_id
       , b.*
FROM     account a
LEFT JOIN address b
ON      b.acc_id=a.acc_id
QUALIFY ROW_NUMBER() OVER (PARTITION BY a.acc_id
                           ORDER BY     b.address_type) = 1

QUALIFY是一个 Teradata 扩展,非常适合这样的事情。使用 BY 子句构建分区PARTITION并按子句排序ORDER BY。然后将使用该函数QUALIFY保留每个分区中的第一行。ROW_NUMBER

当然,我假设您的address_type列具有您想要的排序值。如果值实际上是“主要”和“次要”,则按所示升序排序应该有效(当两个值都存在时选择“主要”)。如果需要,您还可以在子句中使用CASE表达式。ORDER BY

我还强烈建议明确命名您的地址表所需的列。您对没有地址想要“空值”的评论意味着您需要一个LEFT JOIN.

于 2013-05-24T19:58:07.697 回答