我基于名为 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.