我基于名为 acc_id 的列加入两个表(帐户、地址)
地址表有时有多个与 acc_id 关联的地址,它们通过类型列进行区分,该列标记地址是主地址还是辅助地址。
我想加入 acc_id 上的两个表,地址表的列在结果中应该如下:
- 如果没有地址,则为空
- 如果存在 1 个地址,则该地址的列
- 如果存在 2 个地址,则主地址的列
如何在 (Teradata-)SQL 中执行此操作?
案例陈述可能对您有用!
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 = '次要'
这是一个更简单的 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
.