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.