إجراء تغيير وتحديث الجدول على العلاقة الهرمية لمعرفة ما إذا كان هناك أي أطفال

StackOverflow https://stackoverflow.com/questions/2470543

سؤال

لدي جدول هرمي على Oracle PL/SQL. شيء مثل:

create table hierarchical (
   id             integer primary key,
   parent_id          references hierarchical ,
   name           varchar(100));

أحتاج إلى إنشاء إجراء لتغيير هذا الجدول حتى أحصل على حقل جديد يخبره ، لكل عقدة ، إذا كان لديه أي أطفال أم لا.

هل من الممكن القيام بالتحديث والتحديث في إجراء واحد؟ أي عينات رمز ستكون موضع تقدير كبير.

شكرًا

هل كانت مفيدة؟

المحلول

لا يمكنك القيام ALTER TABLE (DDL) و ال UPDATE (DML) في خطوة واحدة.

سيكون عليك القيام ALTER TABLE, ، تليها UPDATE.

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE hierarchical ADD child_count INTEGER';
  --
  EXECUTE IMMEDIATE '
  UPDATE hierarchical h
  SET child_count = ( SELECT COUNT(*)
                      FROM hierarchical h2
                      WHERE h2.parent_id = h.id )';
END;

فكر مرتين قبل القيام بذلك رغم ذلك. يمكنك بسهولة معرفة ذلك إذا كان id لديه أي طفل مع استعلام.

هذا واحد من شأنه أن يعطيك العقد الطفل لجميع أفضل nodes على سبيل المثال:

SELECT h.id, h.name, COUNT(childs.id) child_count
FROM hierarchical h
LEFT JOIN hierarchical childs ON ( childs.parent_id = h.id )
WHERE h.parent_id IS NULL
GROUP BY h.id, h.name

إن إضافة عمود إضافي يحتوي على بيانات زائدة عن الحاجة يجعل تغيير بياناتك أكثر صعوبة ، حيث سيتعين عليك دائمًا تحديث الأصل أيضًا ، عند إضافة/إزالة الأطفال.

نصائح أخرى

إذا كنت بحاجة فقط إلى معرفة ما إذا كان الأطفال موجودين ، يمكن للاستعلام التالي القيام بذلك بدون حلقة أو العمود غير الطبيعي.

    select h.*, connect_by_isleaf as No_children_exist
      from hierarchical h
start with parent_id is null
connect by prior id = parent_id; 

إرجاع connect_by_leaf 0 إذا كان الصف يحتوي على أطفال ، 1 إذا لم يحدث ذلك.

أعتقد أنه من المحتمل أنك قد تحصل على العدد الدقيق من الأطفال من خلال الاستخدام الذكي للوظائف التحليلية والعمود الزائف المستوى ، لكنني لست متأكدًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top