Оператор слияния, выдающий ошибку на Oracle при попытке объединить две таблицы - PullRequest
1 голос
/ 19 октября 2019

У меня есть таблица ученика как:

enter image description here

У меня есть таблица stud_claim как:

enter image description here

student_id - внешний ключ таблицы student.

В таблице stud_claim у меня есть paid_date столбец .paid_date содержит некоторые данные, а некоторая строка имеет значение null. Мне нужно обновить таблицу stu_claim, где paid_date имеет значение null, и поместить значение service_date в это значение paid_date,если paid_date равен null. Для обновления paid_date другое условие для них должно соответствовать id таблицы student и stud_claim из stud_claim.

Я попытался использовать оператор слияния, но егоне работает:

MERGE INTO offc.stud_claim A
USING offc.student B
ON (A.student_id=B.id AND A.PAID_DATE IS NULL)
WHEN MATCHED THEN
UPDATE SET A.PAID_DATE=B.SERVICE_DATE

Или просто с помощью оператора update также возможно или нет?

Я получил ошибку при:

ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."PAID_DATE"

Я пытался из sqlтакже как:

update offc.stud_claim a set paid_date=(select id from offc.student b where b.id=a.student_id) where a.paid_id is NULL;

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Для этого будет достаточно простого заявления об обновлении. В вашем операторе обновления есть проблема (вы выбираете id вместо service_date)

Update offc.stud_claim a 
set paid_date=
(select service_date
   from offc.student b 
  where b.id=a.student_id) 
where a.paid_date is NULL;

В merge вы не можете update column, которые используются вon предложение, чтобы вы могли достичь его, используя WHERE предложение следующим образом:

MERGE INTO offc.stud_claim A
USING offc.student B
ON (A.student_id=B.id)
WHEN MATCHED THEN
UPDATE SET A.PAID_DATE=B.SERVICE_DATE
WHERE A.PAID_DATE IS NULL;

Cheers !!

0 голосов
/ 19 октября 2019

Это способ обновить с использованием простого UPDATE из обновляемого представления объединения .

Сначала вы объединяете две таблицы, выбирая столбцы, которые должныбыть обновлены и исходные столбцы для обновления:

select a.id, a.service_date, b.paid_date
from student a
join student_claim b
on a.id = b.student_id
where b.paid_date is NULL and
a.service_date is not NULL

Обратите внимание, что при выполнении этого выбора вы можете проверить, scoupe, если будущее UPDATE.

I 'Например, исключая строки с service_date is NULL, так как вы, вероятно, не захотите обновить NULL до NULL (в случае, если столбец равен nullable )

Чем обернуть запрос на соединение как подзапрос и выполнитьUPDATE на нем.

update (
select a.id, a.service_date, b.paid_date
from student a
join student_claim b
on a.id = b.student_id
where b.paid_date is NULL and
a.service_date is not NULL
)
set paid_date = service_date

Обратите внимание, что единственным предварительным условием для этого является то, что таблица STUDENT является сохраняющей ключ . т. е. для присоединенного ключа существует уникальный индекс (что наиболее вероятно, если ID является первичным ключом).

В противном случае вы получите это исключение ORA-01779: cannot modify a column which maps to a non key-preserved table.

В противоположность этому вы можете использовать оператор MERGE в случае, если в таблице STUDENT больше строк с таким же ID, но оператор будет иметь значение ORA-30926: unable to get a stable set of rows in the source tables

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...