পিতা-সন্তানের গাছের শ্রেণিবদ্ধ অর্ডার ch


21

এসকিউএল সার্ভার ২০০৮ আর 2-এ আমার নিম্নলিখিত তথ্যগুলি রয়েছে। SQLFiddle

স্কিমা:

টেবিল তৈরি করুন [ডিবিও] [[আইসিফিল্টারস] (
   [আইসিফিল্টারআইডি] [অন্তর্] পরিচয় (1,1) নকল নয়,
   [প্যারেন্টিড] [অন্ত:] শূন্য নয় 0,
   [ফিল্টারডেস্ক] [বারচার] (৫০) শূন্য নয়,
   [সক্রিয়] [ক্ষুদ্রকণ্ঠ] 1 টি শুল্ক নয়,
 সংরক্ষণ করুন [পিকে_আইসি ফিল্টার] প্রাথমিক কী ক্লাস্টার্ড 
 ([আইসিফিল্টারআইডি] এএসসি) সাথে 
    PAD_INDEX = বন্ধ,
    STATISTICS_NORECOMPUTE = বন্ধ,
    আইজিএনওর_দু_পিকে = বন্ধ,
    ALLOW_ROW_LOCKS = চালু,
    ALLOW_PAGE_LOCKS = চালু
 ) চালু [প্রাথমিক]
) চালু [প্রাথমিক]

অন্তর্ভুক্ত করুন [ডিবিও] [[আইসিফিল্টারস] (প্যারেন্টআইডি, ফিল্টারডেস্ক, সক্রিয়)
মানগুলি 
(0, 'পণ্যের ধরণ', 1),
(1, 'ProdSubType_1', 1),
(1, 'ProdSubType_2', 1),
(1, 'ProdSubType_3', 1),
(1, 'ProdSubType_4', 1),
(2, 'PST_1.1', 1),
(2, 'PST_1.2', 1),
(2, 'PST_1.3', 1),
(2, 'PST_1.4', 1),
(2, 'PST_1.5', 1),
(2, 'PST_1.6', 1),
(2, 'PST_1.7', 0),
(3, 'PST_2.1', 1),
(3, 'PST_2.2', 0),
(3, 'PST_2.3', 1),
(3, 'PST_2.4', 1),
(14, 'PST_2.2.1', 1),
(14, 'PST_2.2.2', 1),
(14, 'PST_2.2.3', 1),
(3, 'PST_2.8', 1)

টেবিল:

| ICFILTERID | প্যারেন্টিড | ফিল্টারডেস্ক | ক্রিয়াকলাপ |
--------------------------------------------------
| 1 | 0 | পণ্যের ধরণ | 1 |
| 2 | 1 | ProdSubType_1 | 1 |
| 3 | 1 | ProdSubType_2 | 1 |
| 4 | 1 | ProdSubType_3 | 1 |
| 5 | 1 | ProdSubType_4 | 1 |
| 6 | 2 | PST_1.1 | 1 |
| 7 | 2 | PST_1.2 | 1 |
| 8 | 2 | PST_1.3 | 1 |
| 9 | 2 | PST_1.4 | 1 |
| 10 | 2 | PST_1.5 | 1 |
| 11 | 2 | PST_1.6 | 1 |
| 12 | 2 | PST_1.7 | 0 |
| 13 | 3 | PST_2.1 | 1 |
| 14 | 3 | PST_2.2 | 0 |
| 15 | 3 | PST_2.3 | 1 |
| 16 | 3 | PST_2.4 | 1 |
| 17 | 14 | PST_2.2.1 | 1 |
| 18 | 14 | PST_2.2.2 | 1 |
| 19 | 14 | PST_2.2.3 | 1 |
| 20 | 3 | PST_2.8 | 1 |

প্রতিটি সারিতে তার পিতামাতাদের এবং মূলের আইডি থাকে parentid = 0FilterDescগুলি তাই আমি ক্রম জন্য ঐ বিশ্লেষণ করতে চেষ্টা করতে পারবে না শুধু নমুনা বিবরণ।

প্রশ্নটি

গাছের মতো সমস্ত সারিটি নির্বাচন করা কি সম্ভব? যদি তাই হয়, কিভাবে? আমি যখন 'গাছের মতো' বলি, তার অর্থ আমি তার সমস্ত বাচ্চাদের অনুসরণ করে পিতা-মাতারকে পুনরাবৃত্তভাবে বেছে নেব, তারপরে তাদের প্রত্যেকের সমস্ত বাচ্চা ইত্যাদি। একটি গভীরতা প্রথম গাছের ট্র্যাভারসাল।

আমার বন্ধুরা এবং আমি চেষ্টা করেছি কিন্তু আমরা কার্যকর সমাধানে কম হয়েছি তবে চেষ্টা চালিয়ে যাব। আমি স্ক্যুলে মোটামুটি নতুন তাই সম্ভবত এটি সহজেই করা যেতে পারে এবং আমি প্রয়োজনের চেয়ে জিনিসগুলি আরও শক্ত করে তুলছি।

উদাহরণ (পছন্দসই) আউটপুট:

| ICFILTERID | প্যারেন্টিড | ফিল্টারডেস্ক | ক্রিয়াকলাপ |
--------------------------------------------------
| 1 | 0 | পণ্যের ধরণ | 1 |
| 2 | 1 | ProdSubType_1 | 1 |
| 6 | 2 | PST_1.1 | 1 |
| 7 | 2 | PST_1.2 | 1 |
| 8 | 2 | PST_1.3 | 1 |
| 9 | 2 | PST_1.4 | 1 |
| 10 | 2 | PST_1.5 | 1 |
| 11 | 2 | PST_1.6 | 1 |
| 12 | 2 | PST_1.7 | 0 |
| 3 | 1 | ProdSubType_2 | 1 |
| 13 | 3 | PST_2.1 | 1 |
| 14 | 3 | PST_2.2 | 0 |
| 17 | 14 | PST_2.2.1 | 1 |
| 18 | 14 | PST_2.2.2 | 1 |
| 19 | 14 | PST_2.2.3 | 1 |
| 15 | 3 | PST_2.3 | 1 |
| 16 | 3 | PST_2.4 | 1 |
| 20 | 3 | PST_2.8 | 1 |
| 4 | 1 | ProdSubType_3 | 1 |
| 5 | 1 | ProdSubType_4 | 1 |

সিটিই ব্যবহার করা সবচেয়ে ভাল হবে
কিন শাহ

1
এখানে একটি থ্রেড প্রদর্শিত হচ্ছে যাতে কোনও নির্দিষ্ট ক্রমে লোড হওয়া টেবিলের ডেটা ছাড়াই পছন্দসই ফলাফলের বাছাই করা হয়। এটি "পাথ" তৈরি করতে সারি_নম্বার () এবং পার্টিশন ব্যবহার করে যা পছন্দসই বাছাই সক্ষম করে। ask.sqlservercentral.com/questions/48518/...

উত্তর:


25

ঠিক আছে, পর্যাপ্ত মস্তিষ্কের কোষ মারা গেছে।

এসকিউএল ফিডল

WITH cte AS
(
  SELECT 
    [ICFilterID], 
    [ParentID],
    [FilterDesc],
    [Active],
    CAST(0 AS varbinary(max)) AS Level
  FROM [dbo].[ICFilters]
  WHERE [ParentID] = 0
  UNION ALL
  SELECT 
    i.[ICFilterID], 
    i.[ParentID],
    i.[FilterDesc],
    i.[Active],  
    Level + CAST(i.[ICFilterID] AS varbinary(max)) AS Level
  FROM [dbo].[ICFilters] i
  INNER JOIN cte c
    ON c.[ICFilterID] = i.[ParentID]
)

SELECT 
  [ICFilterID], 
  [ParentID],
  [FilterDesc],
  [Active]
FROM cte
ORDER BY [Level];

2
এটাই আমার দরকার ছিল! আমি সম্মতি দিচ্ছি যে অনেক মস্তিষ্কের কোষ এটিতে মারা গেছে। আমি যা চাইছিলাম তাতে আমি পরিষ্কার ছিলাম না? যদি তাই হয় তবে আমি ভবিষ্যতের রেফারেন্সের জন্য প্রশ্নটি সম্পাদনা করব। আমি অবশ্যই এটির প্রয়োজনের চেয়ে বেশি শক্ত করে
তুলছিলাম

1
@ আর্কাইঞ্জল 33 আপনি ইস্যুটি এবং আপনার যা প্রয়োজন তা পেশ করে একটি ভাল কাজ করেছেন। প্লাস, স্ক্যালফিল্ড সত্যিই সাহায্য করে।
ট্র্যাভিস

2
+1 তবে [আইসিফিল্টারআইডি] [অন্তর্] পরিচয় (১,১) বাছাইয়ের জন্য কেবলমাত্র এটি কাজ করবে এটি সঠিক ক্রমে আইটেমগুলি সন্নিবেশ করা হয়েছে, তবে বাছাইয়ের জন্য অন্য একটি ক্ষেত্র এখনও ওটি দ্বারা প্রয়োগ করা হয়নি
বম্মি

4
আমি বিশ্বাস করি না যে এটি একটি 100% সঠিক সমাধান। কঠোরভাবে এটি শ্রেণিবদ্ধে সমস্ত সারিগুলি তাদের সঠিক স্তর সহ তালিকাভুক্ত করে, এটি প্রশ্নটি যে ক্রমে তাকে জিজ্ঞাসা করতে বলেছিল সেভাবে এটি তালিকাভুক্ত করে না। প্রশ্ন অনুযায়ী সঠিক ক্রমে সারিগুলি তালিকাভুক্ত করা সম্ভব হবে? আমি এটিও সন্ধান করছি।

1
এটি আমার প্রশ্নের উত্তর দেয় কারণ [FilterDesc]কলামে সরবরাহিত ডেটা কল্পিত এবং সেই আদেশটি অপ্রয়োজনীয় / গুরুত্বহীন। @ ট্র্যাভিস গানের উত্তরে যুক্তি অনুসরণ করে এই আদেশটি পেতে সকলকেই অবশ্যই এটি করতে হবে অন্যটিতে যুক্ত CASTকরা Level। যেমন। Level + CAST( CAST(i.[ICFilterID] AS varbinary(max)) AS Levelহয়ে যায় Level + CAST(i.[FilterDesc] AS varbinary(max)) + CAST(i.[ICFilterID] AS varbinary(max)) AS Level
আর্কাইঞ্জল

1

উপরেরটি আমার পক্ষে সঠিকভাবে কাজ করছে বলে মনে হয় না। ফেসবুক ধরণের ডেটা সহ একটি 2 টেবিল সেটআপ কল্পনা করুন। সারণী 1, আপনার অন্যান্য ক্ষেত্রগুলি পোস্টআইড + রয়েছে। পোস্টআইডি হ'ল স্বতঃবৃদ্ধি এবং স্পষ্টতই আপনার ইন্টারফেসে আপনি DESC কে শীর্ষে সর্বাধিক পোস্ট রাখতে বাছাই করবেন।

এখন মন্তব্য সারণীর জন্য। সারণী 2 এই টেবিলটি মন্তব্যআইড হ'ল প্রাথমিক কী, অটো নম্বর। আপনার গুইতে, আপনি এএসসি প্রদর্শন করতে চান, যাতে থ্রেডটি পড়ার সময় তা বোঝা যায়। (শীর্ষে সবচেয়ে পুরানো (ছোট সংখ্যা)) সারণী 2 এর অন্যান্য গুরুত্বপূর্ণ কীগুলি হ'ল পোস্ট আইডি (পোস্টগুলিতে ফিরে এফকে), এবং প্যারেন্টআইড (এফকে টু কমেন্টআইডি) যেখানে প্যারেন্টআইড নাল হবে যদি এটি কোনও পোস্টে "মূল" মন্তব্য হয়। কেউ যদি কোনও মন্তব্যে উত্তর দেয় তবে প্যারেন্ট আইড কমেন্টেডের সাথে পপুলেশন হবে।
আশা করি ছেলেরা বয়ে যাবেন। সিটিই এর মতো দেখতে পাবেন:

WITH  Comments
        AS ( SELECT  CommentId , ParentId, CAST(CommentId AS VARBINARY(MAX)) AS Sortkey, 0 AS Indent
             FROM    dbo.Comments
             WHERE   ParentId IS NULL AND PostId = 105
             UNION ALL
             SELECT  b.CommentId , b.ParentId,  c.Sortkey + CAST(b.CommentId AS varbinary(max))  AS Sortkey, c.Indent + 1 AS Indent
             FROM    dbo.Comments b
             INNER JOIN Comments c ON c.CommentId = b.ParentId
           )
   SELECT   *
   FROM     Comments
   ORDER BY Sortkey

নমুনা আউটপুট

1   NULL    0x0000000000000001  0
5   1   0x00000000000000010000000000000001  1
6   5   0x000000000000000100000000000000010000000000000005  2
2   NULL    0x0000000000000002  0

এফ / বি পোস্টের ১০৫-তে একটি দুটি মন্তব্য ছিল (মন্তব্যআইডিস 1 এবং 2) তারপরে কেউ মন্তব্য 1 (কমেন্টআইড 5, প্যারেন্টআইড 1) এ উত্তর দিয়েছেন, এবং তারপরে অন্য কেউ সেই উত্তরটির উপরে মন্তব্য করেছিলেন, সুতরাং কমেন্ট 5 (মন্তব্য আইড 6, প্যারেন্টআইড 6)

এবং ভায়োলা, ক্রমটি সঠিক, পোস্টের অধীনে, আপনি এখন মন্তব্যগুলি সঠিক সিকোয়েন্সে দেখাতে পারেন। পোস্টগুলি ইনডেন্ট করতে যাতে এটি ফেসবুকের মতো তৈরি হয় এবং আউটলাইন হয় (স্তরটি যত গভীর হয় তত বেশি বাম দিক থেকে প্রান্তিক করা আবশ্যক), আমার কাছে ইন্ডেন্ট নামে একটি কলামও রয়েছে। শিকড়গুলি 0 হয় এবং তারপরে ইউনিয়নে, আমাদের c.Indent + 1 AS ইনডেন্ট কোড অনুসারে, আপনি এখন ইন্ডেন্টটি 32px ধরে নিতে পারেন, এবং একটি মন্তব্যকে একটি সুন্দর স্তরক্রম এবং রূপরেখায় দেখান।

আমি আমার সোর্টকি তৈরির জন্য চালিকা শক্তি হিসাবে অটো ইনক্রিমেন্ট প্রাথমিক কী ব্যবহার করে কোনও সমস্যা দেখছি না, কারণ +1 সহ বীজযুক্ত ডেটাবেস পরিচালিত কীকে গণ্ডগোল করার চেয়ে আপনার বার্তাগুলির তারিখগুলি (কমেন্টেট) আরও ভাল পরিবর্তন হয়েছে seeds


0
create table pc ( parent varchar(10), child varchar(10) )

insert into pc values('a','b');
insert into pc values('a','c');
insert into pc values('b','e');
insert into pc values('b','f');
insert into pc values('a','d');
Insert into pc values('b','g');
insert into pc values('c','h');
insert into pc values('c','i');
insert into pc values('d','j');
insert into pc values('f','k');
insert into pc values('x','y');
insert into pc values('y','z');
insert into pc values('m','n');

 DECLARE @parent varchar(10) = 'a';
 WITH cte AS
 (
  select null parent, @parent child, 0 as level
   union
  SELECT  a.parent, a.child , 1 as level
    FROM pc a
   WHERE a.parent = @parent
   UNION ALL
  SELECT a.parent, a.child , c.level +    1
  FROM pc a JOIN cte c ON a.parent = c.child
  )
  SELECT distinct parent, child , level
  FROM cte
  order by level, parent

এটি আপনাকে সমস্ত বংশধর এবং স্তর প্রদান করবে।
আশাকরি এটা সাহায্য করবে :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.