Использование оператора Merge для одной таблицы - PullRequest
0 голосов
/ 09 мая 2018

Можно ли использовать оператор слияния для одной таблицы? Я хочу проверить перед вставкой, что если такой же набор значений уже существует, то эта запись должна быть обновлена, а если нет, то она должна быть вставлена. Я искал в Интернете, но я получил пример слияния с 2 таблицей. Я пытался на одном столе, но я не смог получить положительные результаты. Значения, которые я пытаюсь проверить, будут динамическими. Я хочу использовать этот запрос в моем приложении.

Я пытаюсь проверить (в приведенном ниже случае только столбец "Major"), совпадают ли два столбца, тогда эту запись следует обновить, а если нет, то ее следует вставить.

Я создал образец таблицы ученика. ниже запрос.

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)

Ниже приведен запрос, который я использую

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') 

Я получаю сообщение об ошибке ниже

ORA-30926: не удалось получить стабильный набор строк в исходных таблицах

Может быть, я делаю вещи совершенно неправильно. Может кто-нибудь, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 09 мая 2018

Используйте SELECT ... FROM DUAL в предложении USING для генерации одной строки с вашими данными:

SQL Fiddle

Настройка схемы Oracle 11g R2:

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);

Запрос 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 )

Запрос 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) |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...