【发布时间】: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 的解决方案很好。