كيفية تنفيذ "hasChildren" عبارة SELECT في SQL؟
سؤال
ودعونا نقول لدي الجدول التالي:
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 أماكن، مما يجعلها أكثر عرضة للبيانات الخاصة بك لتصبح غير متناسقة. سيكون لديك للحفاظ على هذا العمود كلما قمت بإدراج طفل جديد، وحذف واحدة موجودة أو تحديث والد الطفل.