Как ВСТАВИТЬ строку в таблицу, если эта строка еще не существует в той же таблице
Как INSERT
строка в таблице, если эта строка еще не существует в той же таблице? Я хочу что-то подобное.
insert into note (note_id, user_book_id, course_user_id, book_edition_id, book_id, role_type_id, page_id, book_page_number, xcoord, ycoord,
width, height, share_across_courses, date_created, date_updated, created_by, updated_by, description, share_with_students,text)
select note_s.nextval, i_user_book_id, i_course_user_id, book_edition_id, book_id, n.role_type_id, page_id, book_page_number, xcoord, ycoord, width, height, share_across_courses, sysdate, sysdate, i_user_id, i_user_id, description, share_with_students,text
from note n inner join course_user cu
on n.course_user_id = cu.course_user_id
where cu.course_id = 23846
and where not exists (select note_s.nextval, i_user_book_id, i_course_user_id, book_edition_id, book_id, n.role_type_id, page_id, book_page_number, xcoord, ycoord,
width, height, share_across_courses, sysdate, sysdate, i_user_id, i_user_id, description, share_with_students,text
from note n inner join course_user cu
on n.course_user_id = cu.course_user_id
where cu.course_id = 23846);
То есть в таблице примечаний, если запись уже существует для определенного course_user_id, тогда ничего не делать. В противном случае, если нет записи для этого конкретного course_user_id, вставьте в примечание для этого course_user_id.
Но мой код не работает.
Вот, note_id
является PRIMARY KEY
в таблице заметок и Course_user_id
является PRIMARY KEY
в таблице course_user.
2 ответа
Более того, вы можете попробовать другой подход, используя ORACLE HINTS, чтобы избежать дублирования при вставке INDEX, как показано ниже. Но это применимо для 11g Oracle Oracle и выше. Надеюсь это поможет.
INSERT
/*+ ignore_row_on_dupkey_index(note_id) */
INTO note
(
note_id,
user_book_id,
course_user_id,
book_edition_id,
book_id,
role_type_id,
page_id,
book_page_number,
xcoord,
ycoord,
width,
height,
share_across_courses,
date_created,
date_updated,
created_by,
updated_by,
description,
share_with_students,
text
)
(SELECT note_s.nextval,
i_user_book_id,
i_course_user_id,
book_edition_id,
book_id,
n.role_type_id,
page_id,
book_page_number,
xcoord,
ycoord,
width,
height,
share_across_courses,
sysdate,
sysdate,
i_user_id,
i_user_id,
description,
share_with_students,
text
FROM note n
INNER JOIN course_user cu
ON n.course_user_id = cu.course_user_id
WHERE cu.course_id = 23846
AND NOT EXISTS
(SELECT note_s.nextval,
i_user_book_id,
i_course_user_id,
book_edition_id,
book_id,
n.role_type_id,
page_id,
book_page_number,
xcoord,
ycoord,
width,
height,
share_across_courses,
sysdate,
sysdate,
i_user_id,
i_user_id,
description,
share_with_students,
text
FROM note n
INNER JOIN course_user cu
ON n.course_user_id = cu.course_user_id
WHERE cu.course_id = 23846
));
Вы можете попробовать MERGE для достижения этой цели. Надеюсь ниже поможет фрагмент. Я не проверял это, поскольку у меня нет рабочего пространства со мной нет \w.
MERGE INTO note nt USING
(SELECT note_s.nextval,
i_user_book_id,
i_course_user_id,
book_edition_id,
book_id,
n.role_type_id,
page_id,
book_page_number,
xcoord,
ycoord,
width,
height,
share_across_courses,
sysdate,
sysdate,
i_user_id,
i_user_id,
description,
share_with_students,
text
FROM note n
INNER JOIN course_user cu
ON n.course_user_id = cu.course_user_id
WHERE cu.course_id = 23846
AND NOT EXISTS
(SELECT note_s.nextval,
i_user_book_id,
i_course_user_id,
book_edition_id,
book_id,
n.role_type_id,
page_id,
book_page_number,
xcoord,
ycoord,
width,
height,
share_across_courses,
sysdate,
sysdate,
i_user_id,
i_user_id,
description,
share_with_students,
text
FROM note n
INNER JOIN course_user cu
ON n.course_user_id = cu.course_user_id
))A ON (a.course_user_id = nt.course_user_id)
WHEN MATCHED THEN
UPDATE SET nt.bookId = a.book_id /*-- dummy update*/
WHEN NOT MATCHED THEN
INSERT
(
nt.note_id,
nt.user_book_id,
nt.course_user_id,
nt.book_edition_id,
nt.book_id,
nt.role_type_id,
nt.page_id,
nt.book_page_number,
nt.xcoord,
nt.ycoord,
nt.width,
nt.height,
nt.share_across_courses,
nt.date_created,
nt.date_updated,
nt.created_by,
nt.updated_by,
nt.description,
nt.share_with_students,
nt.text
)
VALUES
(
a.note_id,
a.user_book_id,
a.course_user_id,
a.book_edition_id,
a.book_id,
a.role_type_id,
a.page_id,
a.book_page_number,
a.xcoord,
a.ycoord,
a.width,
a.height,
a.share_across_courses,
a.date_created,
a.date_updated,
a.created_by,
a.updated_by,
a.description,
a.share_with_students,
a.text
);