سؤال

id  parent_id
1   0
2   0
3   2
4   0
5   1
6   0

أنا بحاجة إلى استعلام الذي سيعود الوالد الصفوف (parent_id=0) تليها صفوف الأطفال:

  1. أولا الوالدين
  2. جميع الأطفال من الأم الأولى
  3. الثاني الوالدين
  4. جميع الأطفال من الأم الثانية
  5. الثالث الوالدين
  6. الرابع الوالدين

النتيجة المتوقعة:أمرت 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
;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top