【发布时间】:2020-02-21 19:04:04
【问题描述】:
我有一个使用 Merge 语句的现有流程。我现在需要在其中一个表中添加其他列。我在表 A 的主索引中添加了一个新字段,但该数据在合并源表 B 中不存在,因此合并失败。如果我删除表 A 上的主索引,合并也会失败。
-- TABLEA Primary Index - COL1,COL2,COL3,COL4,COL5,COL6
-- TABLEB No Primary Index
Merge into TableA
Using TableB
on A.COL1 = B.COL1
AND A.COL2 = B.COL2
AND A.COL3 = B.COL3
AND A.COL4 = B.COL4
这会产生错误消息:“合并失败。[5758] 搜索条件必须完全指定目标表的主索引和分区列,并且表达式必须匹配 INSERT 规范的主索引和分区列。 "
如果我从 TableA 中删除主键,我会收到以下消息:“合并失败。[9252] 在没有主索引的表上尝试了无效语句:不允许合并到 NoPI 表。”
那么,如果我不能使用 Merge,因为 TableB 没有 TableA 的一些主索引列,我有什么选择?我不确定是否还有其他 Teradata 功能。
我试过了,但是没有找到TableB中的记录,而TableA中没有:
SELECT B.COL1
,B.COL2
,B.COL11
,B.COL8
,B.COL9
,B.COL3
,B.COL4
,'N'
FROM TABLEB B
WHERE NOT EXISTS (SELECT 1
FROM TABLEA A
INNER JOIN TABLEB B
ON B.COL1 = A.COL1
AND B.COL2 = A.COL2
AND B.COL3 = A.COL3
AND B.COL4 = A.COL4)
【问题讨论】:
-
主索引不必与主键相同。您可以使用原始列定义非唯一主索引以及包含新列的主键约束,如果这是您想要的。至于您的其他查询,您想要一个相关的子查询而不是单独的连接。换句话说,您只希望
FROM TABLEA A在子查询中具有相同的 ON 子句,而不是FROM TABLEA A INNER JOIN TABLEB B,以便对 B 的引用解析为外部查询。 -
如果您之前的 PI 在访问和分发方面做得很好,为什么还要在其中添加另一列?