【问题标题】:Join using 2 'alternative' columns from one table使用一张表中的 2 个“替代”列加入
【发布时间】:2025-12-16 22:40:01
【问题描述】:

我在 Teradata 中有 2 个像下面这样的大表。我需要加入他们,以便:

  • 保留表 A 中的所有记录 - 就像 A 左连接 B
  • 加入在 A.client_id=B.client_id_1
  • 但如果 B.client_id_1 为空,它可以加入 A.client_id=B.client_id_2

表 A

client_id details_a
1 abc
2 def
3 ghi
4 jkl

表 B

client_id_1 client_id_2 details_b
1 null 123
null 2 456
3 3 789

结果应该是这样的:

client_id details_a client_id_1 client_id_2 details_b
1 abc 1 null 123
2 def null 2 456
3 ghi 3 3 789
4 jkl null null null

表很大,连接是较大脚本的一部分(其他连接使用表 B)

我尝试了类似的东西

Table A LEFT JOIN Table B
    ON (A.client_id = B.client_id_1 OR A.client_id = B.client_id_2)

但结果是产品连接从未完成。

我还想避免两个左连接(在 B.client_id_1 和 B.client_id_2 上),因为这会导致表 B 中的所有列都出现两次。并且表 B 进一步用于以下连接。加上 client_id=3 会有两条记录。

有什么想法吗?上面使用 OR 的 JOIN 有什么问题?

谢谢,R.

【问题讨论】:

  • 语义上没有错。
  • 两个连接在不同的列上,并在select 列表中合并以从tableB 中获取所需的列。非常简单,应该很快
  • ORed 连接条件对于 Teradata 的优化器来说是最坏的情况,正如您所注意到的,唯一的解决方案是 product join。如果你有一个 XOR Kazi 的解决方案很好。

标签: sql join teradata


【解决方案1】:

你可以用case语句:

Table A LEFT JOIN Table B
    ON (A.client_id = case when B.client_id_1 is null then B.client_id_2 else B.client_id_1 end)

或合并:

Table A LEFT JOIN Table B
    ON (A.client_id = Coalesce(B.client_id_1 ,B.client_id_2 ))

如果 B.client_id_1 不为空,则 Coalesce(B.client_id_1 ,B.client_id_2 ) 将返回 B.client_id_1 但如果为空,则条件将返回 B.client_id_2 。

【讨论】:

  • 好的,谢谢。这正是我一直在寻找的。我对合并解决方案感到有些羞耻——这可能是我想到的。我不知道可以以这种方式使用案例。太好了。
  • 不客气。这是一个很好的问题。最良好的祝愿。
最近更新 更多