الوالدين والطفل استعلام sql
-
05-07-2019 - |
سؤال
id parent_id
1 0
2 0
3 2
4 0
5 1
6 0
أنا بحاجة إلى استعلام الذي سيعود الوالد الصفوف (parent_id=0) تليها صفوف الأطفال:
- أولا الوالدين
- جميع الأطفال من الأم الأولى
- الثاني الوالدين
- جميع الأطفال من الأم الثانية
- الثالث الوالدين
- الرابع الوالدين
النتيجة المتوقعة:أمرت id
id parent_id
-------------------------------------------
1 0 (first parent)
5 1 (all children of first parent)
2 0 second parent
3 2 (all children of second parent)
4 0 third parent
6 0 fourth parent
يمكنني استخدام الاتحاد من الآباء تليها كل تشايلدز لكن هذا يعطيني الآباء أولا ثم الأطفال.أحتاج الوالدين على الفور الأطفال.
أي شخص يمكن أن تساعد ؟
المحلول
هذا يمكن إنجازه باستخدام اثنين من الجداول temp و المتغيرات الثلاثة.
CREATE TABLE #Parents ( RowId bigint identity(1,1), Id bigint )
إنشاء جدول #نتائج ( RowId bigint الهوية(1,1), معرف bigint, ParentId bigint )
تعلن @Count1 bigint تعلن @Count2 bigint تعلن @ParentId bigint
إدراج في #الوالدين حدد معرف من الجدول حيث ParentId = 0 ORDER BY Id
مجموعة @Count1 = 0 حدد @Count2 = MAX(RowId) من #الوالدين
بينما @Count1 <@Count2 تبدأ مجموعة @Count1 = @Count1 +1 حدد @ParentId = Id من #الوالدين حيث RowId = @Count1 إدراج في #النتائج (Id, ParentId) VALUES (@Count1, 0) إدراج في #النتائج (Id, ParentId) SELECT ID, ParentId من الجدول حيث ID = @Count1 ORDER BY Id نهاية
حدد Id ، ParentId من #نتائج النظام RowId
إسقاط الجدول #نتائج إسقاط الجدول #الوالدين
نصائح أخرى
إذا كنت في SQL Server 2005+ يمكنك استخدام العودية CTE, التأكد من أن تحافظ على الحقل الذي يمكنك أن النظام في نهاية المطاف.
جرب هذا:
declare @t table (id int, parent_id int)
insert @t
select 1,0
union all select 2,0
union all select 3,2
union all select 4,0
union all select 5,1
union all select 6,0
;
with tree as (
select t.*, convert(varbinary(max),t.id) as ordered
from @t t
where parent_id = 0
union all
select t.*, ordered + convert(varbinary(max),t.id)
from tree base
join
@t t
on t.parent_id = base.id
)
select *
from tree
order by ordered
;