0

I want to update EDFI_id field of a table EFORMDYNAMICFIELDINSTANCE. This field having NULL values. So I want to take ROWID and update this field (EDFI_id).

I tried to update above table in Oracle using CTE but I am getting below error.

ORA-00928: missing SELECT keyword 00928. 00000 - "missing SELECT keyword" *Cause:
*Action: Error at Line: 21 Column: 1

Below is my update statement.

WITH tmp(row_id , ENTERPRISEID,OWNERTYPE,OWNERID,ITEMTYPE,ITEMID) AS (
    SELECT Row_number() over (order by ENTERPRISEID, OWNERTYPE, OWNERID, ITEMTYPE, ITEMID) as row_id , 
           ENTERPRISEID,
           OWNERTYPE,
           OWNERID,
           ITEMTYPE,
           ITEMID 
      FROM EFORMDYNAMICFIELDINSTANCE 
     ORDER BY ITEMID,ITEMTYPE )
UPDATE EFORMDYNAMICFIELDINSTANCE EDFI 
  SET EDFI.EDFI_id = tmp.row_id + 700000 
INNER JOIN tmp ON EDFI.ENTERPRISEID = tmp.ENTERPRISEID 
       AND EDFI.OWNERTYPE = tmp.OWNERTYPE 
       and EDFI.OWNERID = tmp.OWNERID 
       AND EDFI.ITEMTYPE = tmp.ITEMTYPE 
       AND EDFI.ITEMID = tmp.ITEMID;

I want to mention here that I am able to select the data using CTE but unable to update. Below is the select staement.

WITH tmp(row_id , ENTERPRISEID,OWNERTYPE,OWNERID,ITEMTYPE,ITEMID) AS (
    SELECT Row_number() over (order by ENTERPRISEID, OWNERTYPE, OWNERID, ITEMTYPE, ITEMID) as row_id , 
           ENTERPRISEID,
           OWNERTYPE,
           OWNERID,
           ITEMTYPE,
           ITEMID 
      FROM EFORMDYNAMICFIELDINSTANCE 
     ORDER BY ITEMID,ITEMTYPE )
select * 
 from EFORMDYNAMICFIELDINSTANCE EDFI 
INNER JOIN tmp ON EDFI.ENTERPRISEID = tmp.ENTERPRISEID 
  AND EDFI.OWNERTYPE = tmp.OWNERTYPE 
  and EDFI.OWNERID = tmp.OWNERID 
  AND EDFI.ITEMTYPE = tmp.ITEMTYPE 
  AND EDFI.ITEMID = tmp.ITEMID;

I tried to update the table using below query but it was running more than 2 hours so i cancelled the query.

UPDATE EFORMDYNAMICFIELDINSTANCE EDFI
   SET EDFI.EDFI_ID = (SELECT rn.row_id + 7000000 FROM
(Select Row_Number() Over (Order By Enterpriseid,Ownertype,Ownerid,Itemtype,Itemid)As Row_Id , Enterpriseid,Ownertype,Ownerid,Itemtype,Itemid From Eformdynamicfieldinstance) Rn
                  WHERE EDFI.ITEMTYPE=rn.ITEMTYPE and EDFI.ITEMID=rn.ITEMID and EDFI.Enterpriseid=rn.Enterpriseid and edfi.Ownertype=rn.Ownertype and edfi.Ownerid=rn.Ownerid  )
WHERE EXISTS( SELECT 1
                 FROM (select Row_number() over (order by Enterpriseid,Ownertype,Ownerid,Itemtype,Itemid)as row_id , Enterpriseid,Ownertype,Ownerid,Itemtype,Itemid from EFORMDYNAMICFIELDINSTANCE) rn
                WHERE EDFI.ITEMTYPE=rn.ITEMTYPE and EDFI.ITEMID=rn.ITEMID and EDFI.Enterpriseid=rn.Enterpriseid and edfi.Ownertype=rn.Ownertype and edfi.Ownerid=rn.Ownerid) and EDFI.EDFI_ID is null
/

The explain plan of this query is very high while update the record but in case of select the explain plan is pretty good

Note: - Above table EFORMDYNAMICFIELDINSTANCE having more than 200 thousands records.
Please provide a best solution/query to update this table.

This table (EFORMDYNAMICFIELDINSTANCE) having Composite Primary Key on ENTERPRISEID,OWNERTYPE,OWNERID,ITEMTYPE,ITEMID columns.

Giacomo Garabello
  • 307
  • 1
  • 6
  • 16
yogeshom
  • 21
  • 2

0 Answers0