我有一个问题,可以通过使用触发器或Flash数据存档实施完全辅助解决,但这远远超出了要求。
现在,我们正在执行合并,该合并将在一行存在时更新或在行不存在时插入。它运作良好且易于编写。现在,我们有一个新要求,即用户必须知道已更新或插入了哪些行。是的,可以通过在表中引入另一个字段来完成此操作,但这是不允许的,因为那样会更改表。因此,我们不得不创建一个或两个表,以识别通过PK更新或插入的行。
我希望做的是利用现有的MERGE语句并添加插入到辅助表中的功能,但是我无法找到任何能以这种方式工作的合并语句,并且INSERT ALL缺少更复杂的条件合并。
这是当前正在使用的MERGE语句的结构。
MERGE INTO EXISTING_TABLE ET USING TMP_TABLE TMP ON (HRR.ID = TMP.ID)
WHEN MATCHED THEN UPDATE SET
ET.ID = TMP.ID,
ET.TITLE_EN = TMP.TITLE_EN,
ET.TITLE_FR = TMP.TITLE_FR,
WHEN NOT MATCHED THEN INSERT (ID, TITLE_EN, TITLE_FR)
VALUES (TMP.ID, TMP.TITLE_EN, TMP.TITLE_FR);
下面是我希望完成MERGE INSERT ALL的方式。
MERGE INTO EXISTING_TABLE ET USING TMP_TABLE TMP ON (HRR.ID = TMP.ID)
WHEN MATCHED THEN UPDATE
SET
ET.ID = TMP.ID,
ET.TITLE_EN = TMP.TITLE_EN,
ET.TITLE_FR = TMP.TITLE_FR,
INSERT INTO NEW_TABLE (ID, TYPE) VALUES (TMP.ID, 'U')
WHEN NOT MATCHED THEN INSERT ALL
INTO EXISTING_TABLE (ID, TITLE_EN, TITLE_FR) VALUES (TMP.ID, TMP.TITLE_EN, TMP.TITLE_FR),
INTO NEW_TABLE (ID, TYPE) VALUES (TMP.ID, 'I');
我能看到的另一种合理完成此操作的方法是使用PLSQL块,该块可用于行语句,并且速度较慢。
答案 0 :(得分:1)
在我们的站点上,我们使用after触发器来更新审核内容。它的优点是可以通过程序或如果有人不满意更新语句来跟踪更改。
这可能为您完成工作。