带有 Merge 语句的流

Posted

技术标签:

【中文标题】带有 Merge 语句的流【英文标题】:stream with Merge statement 【发布时间】:2021-08-04 18:41:24 【问题描述】:

嗨,下面是我执行与流合并的步骤 雪花 1.创建表 创建或替换表employees(employee_id number, 工资号码, manager_id 号码); 2. 创建流。 在表 employees 上创建或替换流 employees_stream; 3.创建消费者表。 创建或替换表employees_consumer(employee_id number, 工资号,manager_id 号); 4. 我在员工表中插入了一些记录。 插入员工价值观(8,40000,4), (12,50000,9), (3,30000,5), (4,10000,5), (25,35000,9); 5.尝试执行以下命令时出现错误。 合并到 EMPLOYEES_CONSUMER 作为使用(SELECT * FROM EMPLOYEES_STREAM WHERE NOT (METADATA$ACTION= 'DELETE' AND METADATA$ISUPDATE=TRUE)) A.EMPLOYEE_ID=B.EMPLOYEE_ID 上的 B 何时 匹配和 b.METADATA$ACTION='INSERT' 和 b.METADATA$ISUPDATE 然后更新集 A.EMPLOYEE_ID =B.EMPLOYEE_ID, A.SALARY=B.SALARY, A.MANAGER_ID=B.MANAGER_ID 匹配时 b.METADATA$ACTION= 'DELETE' 然后删除时不匹配和 b. METADATA$ACTION='插入'然后插入 (EMPLOYEE_ID,SALARY,MANAGER_ID) 值 (B.EMPLOYEE_ID,B.SALARY,B.MANAGER_ID);错误为:“SQL编译 错误:第 15 行语法错误,第 8 位意外'INTO'。”请 帮助。

【问题讨论】:

【参考方案1】:

这里的语法有一点错误。 使用 MERGE 您不必使用 INTONOT MATCHED 子句上插入。

所以您的 MERGE 查询应该如下所示:

MERGE INTO EMPLOYEES_CONSUMER AS A 
USING (
  SELECT * 
  FROM employees_stream 
  WHERE NOT (METADATA$ACTION= 'DELETE' AND METADATA$ISUPDATE=TRUE)
) AS B 
ON A.EMPLOYEE_ID=B.EMPLOYEE_ID 

WHEN MATCHED AND b.METADATA$ACTION= 'INSERT' AND b.METADATA$ISUPDATE THEN UPDATE 
SET A.EMPLOYEE_ID =B.EMPLOYEE_ID, 
    A.SALARY=B.SALARY, 
    A.MANAGER_ID=B.MANAGER_ID 

WHEN MATCHED AND b.METADATA$ACTION= 'DELETE' THEN DELETE 

WHEN NOT MATCHED AND b. METADATA$ACTION= 'INSERT' THEN INSERT (EMPLOYEE_ID,SALARY,MANAGER_ID) VALUES (B.EMPLOYEE_ID,B.SALARY,B.MANAGER_ID)
;

【讨论】:

谢谢它现在正在工作 @user16595206 如果对您有帮助,您可以单击复选标记将答案标记为已接受

以上是关于带有 Merge 语句的流的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01461 带有 MERGE INTO 语句和 clob 列

优化 MERGE 语句的 SORT MERGE 连接

我可以在 MERGE 语句中对目标应用 WHERE 子句吗?

SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)

Merge语句

Oracle Merge语句