在Oracle中,如果源表不包含主键列,我们使用ROWID函数来获取行地址,以识别插入,从源更新。我想将相同的内容迁移到Snowflake查询,但更新场景出现了问题,作为rowid逻辑的一部分,获得更新值的记录与插入目标的初始记录具有相同的rowid值,因此它匹配并考虑来自以下逻辑的更新值。但问题是如何使用 snowflake 逻辑来处理它??
- 来源:**
SELECT ROWID, CLMN_ID, CLMN_NUM, CLMN_EMP_NAME, CLMN_START_DATE FROM EMPLOYEE_SRC;
- Tgt:**
SELECT ROWID, CLMN_ID, CLMN_NUM, CLMN_EMP_NAME, CLMN_START_DATE FROM EMPLOYEE_TGT;
用于识别事务类型(插入、删除或更新记录)的原始查询:
SELECT a.ROWID as ROWID_TGT, a.CLMN_ID, a.CLMN_NUM, a.CLMN_EMP_NAME,
b.ROWID_SRC, b.CLMN_ID, b.CLMN_NUM, b.CLMN_EMP_NAME ,
IFF ((a.ROWID_TGT) IS NULL, ''I'',
IFF ((b.ROW_ID_SRC) IS NULL, ''D'',
IFF (a.CLMN_ID = b.CLMN_ID
AND a.CLMN_NUM = b.CLMN_NUM
AND a.CLMN_EMP_NAME = b.CLMN_EMP_NAME, ''IGNORE'', ''U''))) AS TRANSACTION_FLAG
FROM EMPLOYEE_TGT AS a FULL OUTER JOIN EMPLOYEE_SRC AS b ON a.ORA_ROWID_TGT = b.ROWID_SRC;
我们可以从相同的序列逻辑中实现插入和删除逻辑,但只是更新场景的问题。我也试过has方法,但它会把一切都认为是新记录本身。
1条答案
按热度按时间tzxcd3kk1#
ROWID伪列返回行的地址。Oracle数据库rowid值包含查找行所需的信息:
对象的数据对象编号行所在的数据文件中的数据块行在数据块中的位置(第一行为0)行所在的数据文件(第一个文件为1)。文件号与表空间相关。
Snowflake没有此Rowid预设,或者即使存在,也不会暴露给用户。您可以做的一个选择是标识组成唯一行的列,并使用它们来编写update语句。