Reputation: 200
Is it possible to use the merge statement for the single table? I want to check before inserting that if the same set of values are already exists then that record should be updated and if not then it should be inserted. I have searched on the internet but I got the example of merge statement with 2 table. I was trying on a single table but I am not able to get the positive results. Values that I am trying to check will be dynamic. I want to use this query in my application.
I am trying to check(In below case only "Major" column) if two columns are matched then that record should be updated and if not then it should be inserted.
I have created a sample table student. below is the query.
create table student (sid int,name varchar(20),major varchar(10),gpa float,tutorid int, PRIMARY KEY (sid))
insert into student values(101,'Bill','CIS',3.45,102)
insert into student values(102,'Mary','CIS',3.1,null)
insert into student values(103,'Sue','Marketing',2.95,102)
insert into student values(104,'Tom','Finanace',3.5,106)
insert into student values(105,'Alex','CIS',2.75,106)
insert into student values(106,'Sam','Marketing',3.25,103)
insert into student values(107,'Joan','Finance',2.9,102)
Below is the query I am using
merge into student a
using (select name,major from student) b
on (a.major=b.major)
when matched then
update set a.name='Rahul'
when not matched then
insert(a.SID,a.major) values(123, 'Temp')
I am getting the below error
ORA-30926: unable to get a stable set of rows in the source tables
Maybe I am doing things completly wrong. Can anyone please help me.
Upvotes: 3
Views: 6532
Reputation: 168720
Use SELECT ... FROM DUAL
in the USING
clause to generate a single row with your data:
Oracle 11g R2 Schema Setup:
create table student (
sid int,
name varchar(20),
major varchar(10),
gpa float,
tutorid int,
PRIMARY KEY (sid)
);
insert into student values(101,'Bill','CIS',3.45,102);
insert into student values(102,'Mary','CIS',3.1,null);
insert into student values(103,'Sue','Marketing',2.95,102);
insert into student values(104,'Tom','Finanace',3.5,106);
insert into student values(105,'Alex','CIS',2.75,106);
insert into student values(106,'Sam','Marketing',3.25,103);
insert into student values(107,'Joan','Finance',2.9,102);
Query 1:
merge into student dst
using (
SELECT 123 AS sid,
'Rahul' AS name,
'Temp' AS major
FROM DUAL
) src
on (src.major=dst.major)
when matched then
update set name=src.name
when not matched then
insert(SID,name,major) values ( src.sid, src.name, src.major )
Query 2:
SELECT * FROM student
| SID | NAME | MAJOR | GPA | TUTORID |
|-----|-------|-----------|--------|---------|
| 101 | Bill | CIS | 3.45 | 102 |
| 102 | Mary | CIS | 3.1 | (null) |
| 103 | Sue | Marketing | 2.95 | 102 |
| 104 | Tom | Finanace | 3.5 | 106 |
| 105 | Alex | CIS | 2.75 | 106 |
| 106 | Sam | Marketing | 3.25 | 103 |
| 107 | Joan | Finance | 2.9 | 102 |
| 123 | Rahul | Temp | (null) | (null) |
Upvotes: 6