2017-05-16 4 views
1

Ich habe eine Tabelle, die Ordner Pfade enthält. Diese Tabelle enthält vier Spalten: DirID, BaseDirID, DirLevel und DisplayPath. DirID - Die ID des Ordners. BaseDirID - Die ID des ersten Ordners in der Hierarchie. Daher teilen sich alle Ordner (Pfade) derselben Hierarchie denselben Wert in dieser Spalte. DirLevel - Die Tiefe des Ordners. DisplayPath - Der Pfad des Ordners.SQL: Finden Sie fehlende Ordner Pfade in Aufspaltung von Hierarchien

Ich muss alle "Lücken" zwischen diesen Ordnern in der Hierarchie finden.

Beispieldaten zum Beispiel:

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' 

Also brauchen wir folgende Daten zu finden:

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' 

Kommentare:

ein. Diese Tabelle enthält mehr als 250.000 Datensätze von Ordnern, , also suchen wir nach dem effizientesten Weg, dies zu tun, sonst wird das Skript für lange Zeit stecken bleiben, Zeit, die wir nicht haben.

b. Ich habe keine Liste aller Ordner. Was ich habe, sind die "root" -Ordner und die "leafs" -Ordner, die ich brauche, um die "Lücken" zwischen ihnen in der Hierarchie zu finden.

c. Die Tabelle kann mehr als eine Hierarchie enthalten und wir müssen die "Lücken" in allen Hierarchien finden.

d. Jede der Hierarchien kann sich teilen. Wie Sie in den Beispieldaten sehen können, teilt sich die erste Hierarchie in zwei Ordnerpfade aus dem Ordner "A \ B": "A \ B \ C" und "A \ B \ F". Und die zweite Hierarchie teilt sich in zwei Ordnerpfade vom Ordner 'U \ V': 'U \ V \ W' und 'U \ V \ M'. Und wir müssen alle "Lücken" auch in solchen Fällen finden, wenn sich die Hierarchien aufteilen.

e. Die SQL Server-Version lautet: SQL 2012 SP3.

Diese Frage ist eine Fortsetzungsfrage für die Frage, die im folgenden Link gestellt wurde: SQL: Find missing hierarchy Folders (Paths) in a table Unsere Frage enthält auch den vierten Kommentar, der in Fettdruck erscheint.

Ich habe gesehen, dass es eine neue Spalte Typ namens "hierarchyid" (Start von SQL Server 2008), die ich dachte, dass könnte uns helfen - https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference Was denkst du?

Vielen Dank im Voraus.

+0

Echtordnernamen unterschiedlich sind oder es sein wird, A \ B ...? –

+0

Die Ordner-Namen können wie alles sein: Kannan Kannan \ Kandasamy Kannan \ Kandasamy \ Nuriel Kannan \ Kandasamy \ Nuriel \ Zrubavely –

Antwort

1

diesen hinzugefügt Pfad (11,2,'U\V\Z\L\O\Q\R\S\T') mehrere fehlende Ordner in einem Pfad zu zeigen:

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 

rextester Demo: http://rextester.com/CEVGZ96613

kehrt:

+-----------+-----------------+ 
| 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 | 
+-----------+-----------------+ 
+0

ich rekursive fehlenden Ordner brauchen. –

+0

Ist die Lösung effizient? Weil ich CharIndex() Multipule mal für jede Zeile in einer Tabelle verwende, die 250.000 Zeilen enthält ... –

+0

habe ich diese Lösung auf Tabelle der Größe ~ 200k versucht. Die Abfrage dauerte mehr als 20 Minuten, bis ich sie abgebrochen habe! Können Sie mir bitte eine effizientere Lösung geben? Ich habe es sehr deutlich in der Frage geschrieben: "Diese Tabelle enthält mehr als 250.000 Aktenordner, also suchen wir nach dem effizientesten Weg dazu". –

Verwandte Themen