في البداية، يبدو أن هناك بعض الأخطاء في الاستعلام الخاص بك. سأقوم بتوضيح الأخطاء وتقديم تعديلات لجعل الاستعلام يعمل بشكل صحيح.
الأخطاء في الاستعلام الحالي:
-
في الفقرة الأخيرة من الاستعلام، يوجد استخدام زائد لكلمة “where”. يجب أن تكون “and” بدلاً من “and where”.
-
الفقرة النهائية تحتوي على فحص
not exists
مع استخدامnote_s.nextval
في الجزء الخاص بالاختيار، مما يسبب خطأ. يجب أن يكون لديك فقط الفحصnot exists
دون استخدامnote_s.nextval
. -
لاحظ أنه يجب تعديل العبارة
where cu.course_id = 23846
في الجزء الأخير من الفقرة لتناسب الشرط الذي تريد فحصه.
تحسين الاستعلام:
sqlinsert 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 1
from note n2
where n2.course_user_id = cu.course_user_id
);
باستخدام هذا الاستعلام المعدل، يجب أن يعمل الإدخال بشكل صحيح وفقًا للمتطلبات التي طلبتها. يتم التحقق من وجود السجل في الجدول note
بناءً على course_user_id
، وإذا لم يكن موجودًا، يتم إدراجه بواسطة الفقرة الرئيسية.
المزيد من المعلومات
في سياق تنفيذ الاستعلام الذي قمت بتقديمه، يمكن توضيح بعض النقاط الهامة لفهم العملية بشكل أفضل:
-
استخدام
INSERT INTO ... SELECT
: تقوم هذه العبارة بإدراج البيانات المستعرضة من الجدول المصدر (note
) إلى الجدول الهدف (note
). يتم تحديد القيم التي يتم إدراجها في الجدول الهدف من خلال الاستعلام المدمج بين الجدولين. -
NOT EXISTS
: يتيح لنا هذا الشرط التحقق من عدم وجود سجل محدد في الجدول المستهدف (note
) بناءً على الشرط المحدد، وبالتحديد على أساسcourse_user_id
. -
note_s.nextval
: يتم استخدام هذا لتوليد قيمة جديدة لعمودnote_id
باستخدام تسلسلnote_s
. يضمن ذلك أن تكون قيمةnote_id
فريدة لكل سجل. -
sysdate
: تستخدم هذه الوظيفة لإدراج التاريخ الحالي عند تنفيذ الإدراج. -
الارتباط بين الجداول: يتم ربط الجدولين
note
وcourse_user
باستخدام الجملةINNER JOIN
على أساسcourse_user_id
، وهو الحقل الذي يتم استخدامه للتحقق من الوجود أو عدم الوجود في الجدول المستهدف.
باستخدام هذا الاستعلام، يمكنك ضمان أنه إذا كان هناك سجل موجود في الجدول note
مع نفس course_user_id
، فلن يتم إدراج سجل جديد، وإلا سيتم إدراج سجل جديد بقيم فريدة وفقًا لتسلسل note_s
والقيم المحددة في الجزء الرئيسي من الاستعلام.