Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ora_rowscn在USING子句中时的Oracle合并语句行为_Sql_Oracle_Oracle11g_Merge Statement - Fatal编程技术网

Sql ora_rowscn在USING子句中时的Oracle合并语句行为

Sql ora_rowscn在USING子句中时的Oracle合并语句行为,sql,oracle,oracle11g,merge-statement,Sql,Oracle,Oracle11g,Merge Statement,我有一个MERGE语句,它给了我可怕的ORA-00904:invalid identifier错误消息。请注意,“无效标识符”错误的典型问题在这里不存在-我没有尝试更新连接的列,也没有拼写错误的列名。我试图在USING子句的SELECT语句中使用oracle伪列ORA_ROWSCN 使用这些示例表,我尝试运行 MERGE INTO MY_MERGE_TABLE D USING (SELECT PRIMARY_KEY, COALESCE (UPDATE_DT, CREAT

我有一个MERGE语句,它给了我可怕的
ORA-00904:invalid identifier
错误消息。请注意,“无效标识符”错误的典型问题在这里不存在-我没有尝试更新连接的列,也没有拼写错误的列名。我试图在
USING
子句的
SELECT
语句中使用oracle伪列
ORA_ROWSCN

使用这些示例表,我尝试运行

MERGE INTO MY_MERGE_TABLE D
  USING
 (SELECT PRIMARY_KEY, 
         COALESCE (UPDATE_DT, CREATED_DT) update_dt,
         ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE) S
   ON (D.PRIMARY_KEY = S.PRIMARY_KEY)
WHEN MATCHED THEN
     UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt),
                D.rowscn = GREATEST(D.rowscn, S.rowscn)
WHEN NOT MATCHED THEN
     INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN)
     VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN);
如果我从USING子句中删除伪列ora_rowscn,我将不再收到错误消息,合并将成功完成

MERGE INTO MY_MERGE_TABLE D
  USING
 (SELECT PRIMARY_KEY, 
         COALESCE (UPDATE_DT, CREATED_DT) update_dt
    FROM MY_SOURCE_TABLE) S
   ON (D.PRIMARY_KEY = S.PRIMARY_KEY)
WHEN MATCHED THEN
     UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt)
WHEN NOT MATCHED THEN
     INSERT (D.PRIMARY_KEY, D.UPDATE_DT)
     VALUES (S.PRIMARY_KEY, S.UPDATE_DT);
如果我将查询放在视图中,则可以成功使用ora_rowscn:

CREATE VIEW MY_VIEW AS 
    SELECT PRIMARY_KEY, 
         COALESCE (UPDATE_DT, CREATED_DT) update_dt,
         ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE;

MERGE INTO MY_MERGE_TABLE D
  USING (SELECT PRIMARY_KEY, UPDATE_DT, ROWSCN FROM MY_VIEW) S
   ON (D.PRIMARY_KEY = S.PRIMARY_KEY)
WHEN MATCHED THEN
     UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt),
                D.rowscn = GREATEST(D.rowscn, S.rowscn)
WHEN NOT MATCHED THEN
     INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN)
     VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN);
有没有办法在不创建查询视图的情况下执行此操作?作为ETL过程的一部分,我必须在许多表上执行此操作,并且不希望构建多个视图

编辑: 根据Glenn在评论中的建议,我尝试将查询放入子查询:

MERGE INTO MY_MERGE_TABLE D
  USING
 (WITH QRY AS 
  (SELECT PRIMARY_KEY, 
         COALESCE (UPDATE_DT, CREATED_DT) update_dt,
         ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE)
  SELECT ORDER_ID, UPDATE_DT, ROWSCN FROM QRY)
 ON (D.PRIMARY_KEY = S.PRIMARY_KEY)
WHEN MATCHED THEN
     UPDATE SET D.update_dt = GREATEST(D.update_dt, S.update_dt),
                D.rowscn = GREATEST(D.rowscn, S.rowscn)
WHEN NOT MATCHED THEN
     INSERT (D.PRIMARY_KEY, D.UPDATE_DT, D.ROWSCN)
     VALUES (S.PRIMARY_KEY, S.UPDATE_DT, S.ROWSCN);
此查询仍然向我提供
ORA-00904:无效标识符
错误消息

下面是DDL来重新创建问题

CREATE TABLE MY_SOURCE_TABLE (
  PRIMARY_KEY NUMBER,
  CREATED_DT TIMESTAMP(6),
  UPDATED_DT TIMESTAMP(6)
);

CREATE TABLE MY_MERGE_TABLE (
  PRIMARY_KEY NUMBER,
  UPDATED_DT TIMESTAMP(6),
  ROWSCN NUMBER
);

INSERT INTO MY_SOURCE_TABLE (PRIMARY_KEY, CREATED_DT, UPDATED_DT)
VALUES (1, SYSDATE-2, SYSDATE);

INSERT INTO MY_SOURCE_TABLE (PRIMARY_KEY, CREATED_DT, UPDATED_DT)
VALUES (2, SYSDATE-1, NULL);

INSERT INTO MY_SOURCE_TABLE (PRIMARY_KEY, CREATED_DT, UPDATED_DT)
VALUES (3, SYSDATE-1, SYSDATE+1);

INSERT INTO MY_MERGE_TABLE (PRIMARY_KEY, UPDATED_DT, ROWSCN)
VALUES (1, SYSDATE-2, 0);

INSERT INTO MY_MERGE_TABLE (PRIMARY_KEY, UPDATED_DT, ROWSCN)
VALUES (2, SYSDATE-1, 0);

我运行了您的SQL并得到了相同的错误(在11.2.0.1上)。然后我试着运行select

SELECT PRIMARY_KEY, 
         COALESCE (UPDATE_DT, CREATED_DT) update_dt,
         ORA_ROWSCN AS rowscn 
    FROM MY_SOURCE_TABLE;

仍然得到了
ORA-00904:“UPDATE_DT”:无效标识符
错误。然后我注意到,在DDL中,
mysource\u表
上的列被称为
UPDATED\u DT
(即带有额外的
D
字符)。在您的
MERGE
语句中更改对该语句的引用使其适用于我,希望这会有所帮助。

在11.2.0.1上,MERGE语句对我适用。您可能需要发布DDL和一些示例数据。是否可以在“using”select子句中使用子查询分解,如此问题的公认答案所示:@jonearles-当您在select语句中使用伪列ORA_ROWSCN作为using子句的一部分时,merge语句对您有效?我使用合并所有的时间没有它,它的罚款。正是在这种情况下,我遇到了问题。@Glenn-我尝试将语句包装在with子句中,也只是一个子查询,它仍然会给出无效标识符错误消息。我将更新这个问题,以反映我已经尝试过了。我创建了具有相同名称和列的表,并且毫无错误地运行了完全相同的SQL语句。