sql - एसक्यूएल:बंटवारे पदानुक्रम में लापता फ़ोल्डर्स पथ खोजें




sql-server sql-server-2012 sql-server-performance (2)

मेरे पास तालिका है जिसमें फ़ोल्डर्स पथ शामिल हैं I इस तालिका में चार कॉलम हैं: DirID , BaseDirID , DirLevel और DisplayPathDirID - फ़ोल्डर का आईडी BaseDirID - पदानुक्रम में पहले फ़ोल्डर का आईडी तो एक ही पदानुक्रम से सभी फ़ोल्डर्स (पथ) इस कॉलम में समान मान साझा करते हैं। DirLevel - फ़ोल्डर की गहराई DisplayPath - फ़ोल्डर का रास्ता

पदानुक्रम में उन फ़ोल्डर्स के बीच सभी "अंतर" खोजने की आवश्यकता है I

उदाहरण के लिए नमूना डेटा:

DirID BaseDirID DirLevel DisplayPath
1   1  1  'A'
2   1  3  'A\B\C'
3   1  5  'A\B\C\D\E'
4   1  3  'A\B\F'
5   1  5  'A\B\F\G\H'
6   2  1  'U'
7   2  3  'U\V\W'
8   2  5  'U\V\W\X\Y'
9   2  3  'U\V\M'
10  2  5  'U\V\M\L\O'

तो हमें निम्न डेटा खोजने की जरूरत है:

BaseDirID DisplayPath
1   'A\B'
1   'A\B\C\D'
1   'A\B\F\G'
2   'U\V'
2   'U\V\W\X'
2   'U\V\M\L'

टिप्पणियाँ:

ए। इस तालिका में 250,000 से अधिक अभिलेख फ़ोल्डर्स हैं, इसलिए हम ऐसा करने का सबसे कारगर तरीका चाहते हैं , अन्यथा स्क्रिप्ट लंबे समय तक फँस जाएगा, हमारे पास समय नहीं है।

ख। मेरे पास सभी फ़ोल्डरों की सूची नहीं है मेरे पास "रूट" फ़ोल्डर्स और "लीफ्स" फ़ोल्डर्स हैं, जिन्हें मुझे पदानुक्रम में "अंतराल" खोजने की आवश्यकता है।

सी। तालिका में एक से अधिक पदानुक्रम शामिल हो सकते हैं और हमें सभी पदानुक्रमों में "अंतराल" खोजने की जरूरत है

घ। प्रत्येक पदानुक्रम विभाजित हो सकता है, जैसा कि आप नमूना डेटा में देख सकते हैं पहली पदानुक्रम 'ए \ बी' फ़ोल्डर से दो फ़ोल्डर्स पथ को विभाजित करता है: 'ए' बी 'सी' और 'ए' बी 'एफ' और दूसरी पदानुक्रम 'यू \ वी' फ़ोल्डर से दो फ़ोल्डर्स पथ को विभाजित करता है: 'यू \ वी \ डब्ल्यू' और 'यू \ वी एम'। और हमें इस तरह के मामलों में भी सभी "अंतर" खोजने की जरूरत है, जब पदानुक्रम अलग हो जाए।

ई। SQL सर्वर संस्करण है: SQL 2012 SP3

यह सवाल उन प्रश्नों के लिए एक निरंतर प्रश्न है, जो निम्नलिखित लिंक में पूछता है: एसक्यूएल: एक तालिका में अनुपस्थित पदानुक्रम फ़ोल्डर्स (पाथ) का पता लगाएं हमारे प्रश्न में 4 वें टिप्पणी शामिल हैं जो बोल्ड में दिखाई देते हैं।

मैंने देखा कि एक नया कॉलम प्रकार है जिसे "पदानुक्रम" कहा जाता है (एसक्यूएल सर्वर 2008 से शुरू होता है), जिसे मैंने सोचा कि वह हमारी मदद कर सकता है- https://docs.microsoft.com/en-us/sql/t-sql/ डेटा प्रकार / पदानुक्रम-डेटा-प्रकार-विधि-संदर्भ आप क्या सोचते हैं?

अग्रिम में धन्यवाद।


Answers

पथ में एकाधिक अनुपलब्ध फ़ोल्डर्स दिखाने के लिए इस जोड़े गए पथ (11,2,'U\V\Z\L\O\Q\R\S\T') करना:

with cte as (
select BaseDirID, DisplayPath = left(DisplayPath,len(DisplayPath)-charindex('\',reverse(DisplayPath)))
from t
where DirLevel > 1
  and not exists (
  select 1 
  from t i
  where t.BaseDirId = i.BaseDirId
    and i.DisplayPath = left(t.DisplayPath,len(t.DisplayPath)-charindex('\',reverse(t.DisplayPath)))
    )
union all 
select BaseDirID, DisplayPath = left(DisplayPath,len(DisplayPath)-charindex('\',reverse(DisplayPath)))
from cte t
where not exists (
  select 1 
  from t i
  where t.BaseDirId = i.BaseDirId
    and i.DisplayPath = left(t.DisplayPath,len(t.DisplayPath)-charindex('\',reverse(t.DisplayPath)))                                                   
    )
)
select distinct * 
from cte

रिक्स्टर डेमो: http://rextester.com/CEVGZ96613

रिटर्न:

+-----------+-----------------+
| BaseDirID |   DisplayPath   |
+-----------+-----------------+
|         1 | A\B             |
|         1 | A\B\C\D         |
|         1 | A\B\F\G         |
|         2 | U\V             |
|         2 | U\V\M\L         |
|         2 | U\V\W\X         |
|         2 | U\V\Z           |
|         2 | U\V\Z\L         |
|         2 | U\V\Z\L\O       |
|         2 | U\V\Z\L\O\Q     |
|         2 | U\V\Z\L\O\Q\R   |
|         2 | U\V\Z\L\O\Q\R\S |
+-----------+-----------------+

मुझे विश्वास नहीं है कि आप इसे ऐसा कर सकते हैं, लेकिन आपको सेटवल फ़ंक्शन दिशा का उपयोग करने में सक्षम होना चाहिए जो कि परिवर्तन करता है।

select setval('sequenceX', (select max(table_id)+1 from table), false)

गलत यह अगले अनुक्रम संख्या को वापस कर देगा जैसा कि दिया गया है।





sql sql-server sql-server-2012 sql-server-performance