【问题标题】:Seeking a Teradata Merge alternative寻求 Teradata Merge 替代方案
【发布时间】: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 在访问和分发方面做得很好,为什么还要在其中添加另一列?

标签: sql teradata


【解决方案1】:

可能不需要在现有 PI 中添加另一列,PI PK。

关于 NOT EXISTS 查询,它是一个不相关的子查询,如果有任何匹配的行,则结果为 true。您需要一个相关的子查询:

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
                    WHERE B.COL1 = A.COL1
                        AND B.COL2 = A.COL2
                        AND B.COL3 = A.COL3
                        AND B.COL4 = A.COL4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 2023-01-19
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    相关资源
    最近更新 更多