سؤال

ودعونا نقول لدي الجدول التالي:

ID | parentID | MoreStuff
1  | -1       |  ...
2  |  1       |  ...
3  |  1       |  ...
4  |  2       |  ...
5  |  1       |  ...

وكيف يمكنني توليد بيان SQL SELECT لمعرفة ما إذا كان صف محدد لدى الأطفال؟ وبعبارة أخرى، أريد أن أعرف إذا ID 1 ديه أطفال، وهو في هذه الحالة لديها 3.

وأنا لست متأكدا من كيفية إنشاء عبارة SQL:

SELECT ID, hasChildren FROM myTable;

وماذا سيحل محله لhasChildren في عبارة SELECT SQL أعلاه؟

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

المحلول

ولم إصدار مجموعة:

SELECT MyTable.Id, CASE WHEN EXISTS 
    (SELECT TOP 1 1  --you can actually select anything you want here
     FROM MyTable MyTableCheck 
     WHERE MyTableCheck.ParentId = MyTable.Id
    ) THEN 1 ELSE 0 END AS HasRows
FROM MyTable

نصائح أخرى

وتاريخ الجدول على نفسها لتجد إذا كان لديه أطفال:

SELECT 
    parent.id as ID
,   case when count(child.id) > 0 then 1 else 0 end as hasChildren 
FROM       myTable parent
LEFT JOIN  myTable child
ON         child.parentID = parent.ID
GROUP BY   parent.id

إذا كنت تعرف بالفعل معرفة هوية الوالد، ثم الاستعلام بسيط - فقط حدد عدد الصفوف مع أن ID الأم

SELECT count(*) FROM myTable where parentID = 1;

وهناك إجابات صحيحة جدا على سؤالك الذي سوف يعمل. ومع ذلك، أود أن تنظر أداء مثل هذا الاستفسار اذا كان لديك بيانات كبيرة جدا.

وإذا كان الذهاب لاستخدام المجموعة حسب أو Sub سؤال للحصول على البيانات، ثم تأكد من كل من الأعمدة ID والرئيسي لها فهارس مستقلة.

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

SELECT * FROM table WHERE haschildren IS NOT NULL

ووالحلول المذكورة أعلاه على ما يرام، ولكن يجب أن لا إضافة عمود مثل 'haschildren "إلا إذا كان لديك مشكلة أداء حقا (انظر هذا المنصب GateKiller). مثل هذا العمود denormalizes قاعدة البيانات، أي سيتم تخزين نفس قطعة من المعلومات في 2 أماكن، مما يجعلها أكثر عرضة للبيانات الخاصة بك لتصبح غير متناسقة. سيكون لديك للحفاظ على هذا العمود كلما قمت بإدراج طفل جديد، وحذف واحدة موجودة أو تحديث والد الطفل.

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