SQL السؤال: الحصول صفوف الرئيسي تليها صفوف الأطفال

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

  •  05-07-2019
  •  | 
  •  

سؤال

ومعرف PARENT_ID

1 0

2 0

و3 2

و4 0

و5 1

و6 0

وأحتاج استعلام التي سيعود الصفوف الأصلية (PARENT_ID = 0)، يليه الصفوف التابعة لها

والد الأول

وجميع الأطفال من الأم الأولى

والد الثاني

وجميع الأطفال من الوالدين الثاني

والد الثالث

والأم الرابع

والنتيجة المتوقعة: بأمر من معرف

ومعرف PARENT_ID

1 0 (الأصل الأول)

و5 1 (جميع الأطفال من الأم الأولى)

2 0 الوالدين الثاني

و3 2 (جميع الأطفال من الوالدين الثاني)

و4 0 الوالد الثالث

و6 0 الأم الرابع

ويمكنني استخدامها اتحاد الآباء تتبعها جميع الطفل ولكن هذا يعطيني الآباء أولا ثم الأطفال. أنا في حاجة الوالدين وعلى الفور أبنائها.

ويمكن لأي شخص أن تساعد؟

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

المحلول

وكنت يمكنك استخدام CTE عودي لذلك:

WITH r AS 
 (SELECT id, 
    NULL AS parent_id, 
    CAST(right('000' + CAST(row_number() 
         OVER (table.id) AS varchar), 3) AS varchar(50))
  FROM table WHERE parent IS NULL

  UNION ALL

  SELECT table.id, table.parent_id, 
    CAST(r.ord + right('000' + CAST(row_number() 
         OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
  FROM r JOIN table 
   ON table.parent = r.id)

 SELECT id 
 FROM r
 ORDER BY left(ord + '000000000000000000000000000000000', 36)

لاحظ أن هذا الإصدار معينة وكسر إن وجدت ID له قيمة أكبر من 999، وسوف كسر إذا كان لديك أكثر من 12 المستويات. إذا كان هذا هو مصدر قلق لك، تحتاج إلى ضبط عدد من الأصفار في مختلف الأماكن.

وربما تكون هناك طرق أفضل، ولكن يعمل هذا واحد.

نصائح أخرى

وهنا هو الحل سبيل المثال باستخدام الوحدة مع جملة ORDER BY (وهو متعود العمل لبناء أعشاشها عميق على الرغم من).

SELECT  p.id, 
        p.parent_id, 
        p.name,  
        p.id AS sequence
FROM topics AS p 
WHERE p.parent_id = 0
UNION 
SELECT  t.id, 
        t.parent_id, 
        t.name, 
        t.parent_id AS sequence
FROM topics AS t
WHERE t.parent_id <> 0
ORDER BY sequence, parent_id, name

وبقدر ما أعرف، لا يمكنك القيام بذلك مع بيان SQL واحد إذا كان كل ما كنت تخزين هو معرف الأم. إذا كنت بحاجة إلى استرداد شجرة البيانات بسرعة، سيكون لديك للنظر في تخزين اجتياز مرحلة ما قبل النظام. انها أسهل مما يبدو وانها موصوفة وصفا جيدا للغاية هنا: HTTP: //articles.sitepoint. كوم / من المادة /-قاعدة بيانات البيانات الهرمية

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