tsql - Extract hierarchical data from one column -


मेरे पास निम्न नमूना डेटा है:

यह मूल रूप से निम्न पदानुक्रम प्रदर्शित करता है:

और मुझे इसे से सभी (एस) तीखा (ई) एनडी जोड़े से मिलना चाहिए (क्रम महत्वपूर्ण नहीं है ):

यहां छवि विवरण दर्ज करें

मेरा समाधान है "सृष्टि" तालिका चर में सभी मानों को धक्का दें:

  1. सभी सशक्त (एस) तीखा (ई) एनडी जोड़े चुनें
  2. उन्हें "गंतव्य" तालिका चर में डालें
  3. "स्रोत" तालिका चर से उन्हें हटाएं
  4. यदि "स्रोत" तालिका चर खाली नहीं है तो चरण 1 निष्पादित करें

मेरे प्रश्न किसी से आए हैं वैकल्पिक हल के साथ? मेरी वास्तविक स्थिति में मेरे पास अधिक पंक्तियाँ हैं और मैं तालिका चर में हटाने और सम्मिलित करने की चिंता कर रहा हूं।

नीचे की स्क्रिप्ट नमूना डेटा जेनरेट करती है:

  DECLARE @ DataSource TABLE ([ आईडी] TINYINT, [प्रकार] CHAR (1)) डाटासर्स ([आईडी], [प्रकार]) मूल्यों में शामिल करें (3, 'एस'), (6, 'ई'), (7, 'एस'), (10, 'एस'), (13, 'ई'), (14, 'ई'), (15, 'एस'), (16, 'एस'), (17, 'एस'), (1 9 , 'एस'), (20, 'एस'), (26, 'ई'), (27, 'ई'), (28, 'ई'), (2 9, 'ई'), (30, ई '), (31,' एस '), (32,' एस '), (35,' ई '), (36,' एस '), (38,' ई '), (39,' एस ' ), (40, 'एस'), (44, 'ई'), (45, 'ई'), (46, 'ई')  

यह थोड़ा जटिल है, लेकिन इसे प्रयास करें:

 ; के रूप में ([आईडी], [प्रकार] का चयन करें, R_ = 1 संघ से row_number () आईडी (आईडी द्वारा क्रम) आर.एन. = 1 संघ से), बी के रूप में ([आईडी] का चयन करें, [प्रकार], आरएन, डाली । [आईडी], ए। [प्रकार], ए.आर.एन, मामला जब ए। [प्रकार] = 'एस' तब 1 जब एक। [प्रकार] = 'ई' फिर -1 और 0 अंत + एलजीएल से जुड़ने से A.rn = b.rn + 1 पर), सी के रूप में ([आईडी], [प्रकार], पंक्ति_ंम्बर () पर (lvl, rn द्वारा [प्रकार] आदेश द्वारा विभाजन b) से बीआरपी चुनें c1.id एस, C2.id ई c c1 से c c2 पर c1.grp = c2.grp जहां c1। [Type] = 's' और c2। [प्रकार] = 'ई' आदेश c1.id ऑप्शन (maxrecursion 0)   

परिणाम: <पूर्व> SE 3 6 7 14 10 13 15 30 16 29 17 28 1 9 27 20 26 31 46 32 35 36 38 39 45 40 44

संपादित करें: क्योंकि आप sqlserver 2012 का उपयोग कर रहे हैं, स्क्रिप्ट को सरल किया जा सकता है, मैंने प्रदर्शन के लिए एक सुधार भी जोड़ा है। मुझे आशा है कि यह आपके मामले में काम करता है। स्क्रिप्ट अब मानते हैं कि 'एस' हमेशा 'ई' से पहले होता है।

 ; के रूप में [आईडी], [प्रकार] का चयन करें, राशि (मामले में [प्रकार] = 'एस' 1 जब [प्रकार] = 'ई' तब -1 अंत) (डेटा द्वारा आईडी) lvl @ DataSource से), बी के रूप में ([आईडी], [प्रकार], पंक्ति_एनम्बर () पर (द्वारा [प्रकार] द्वारा क्रम Lvl, id) grp से a) एस  
के द्वारा जीआरपी द्वारा बी समूह से न्यूनतम (एसडी) एस, अधिकतम (आईडी) ई चुनें।

Comments