2017-02-09 3 views
0

Ich suche Hilfe mit einer Datenbank-Aufgabe, die wahrscheinlich von einigen Objekt-Programmiersprache leichter zu lösen sein wird. In diesem Moment versuche ich, TSQL/SQL Server-Lösung davon zu finden.Netzwerkdaten in SQL Server - Identifizieren separater Routen

Ich verwende eine Quellentabelle, die Daten über Routen enthält. Jeder Datensatz beschreibt einen Link einer Route mit routeNo, originNodeID und destinationNodeID. Das komplizierteste Beispiel von Daten aus dieser Tabelle sieht wie folgt:

routeID originNodeID destinationNodeID 
WRTV ...    ... 
WRTX 5    10 
WRTX 10    15 
WRTX 15    20 
WRTX 20    25 
WRTX 25    30 
WRTX 25    1505 
WRTX 25    2005 
WRTX 30    35 
WRTX 30    1005 
WRTX 35    40 
WRTX 40    45 
WRTX 45    50 
WRTX 1005   1010 
WRTX 1015   1020 
WRTX 1505   1510 
WRTX 1510   1515 
WRTX 2005   2010 
WRTX 2010   2015 
WRTX 2020   2025 
WRTY ....   .... 

So, wie Sie jeder RouteID beschreibt nicht sehen können, eine lineare Strecke aber Route mit Niederlassungen. Der Weg vom Beispiel kann wie folgt aussehen:

   1515 1020 
       / /
      / /
    5 ------ 25 --- 30 -------50 
       \ 
       \ 
       2025 

Nun, was ich tun muß, ist, diesen Weg zu getrennten Wegen zerstückeln:

5-25-30-50 WRTX1 5-25- 30-1020 WRTX2 1515.05.25 WRTX3 2025.05.25 WRTX4

Für jeden der neuen Routen ich brauche nur die Verknüpfungsfolge wie folgt:

routeID originNodeID destinationNodeID 
    WRTX1 5    10 
    WRTX1 10    15 
    WRTX1 15    20 
    WRTX1 20    25 
    WRTX1 25    30 
    WRTX1 30    35 
    WRTX1 35    40 
    WRTX1 40    45 
    WRTX1 45    50 
    WRTX2 5    10 
    WRTX2 10    15 
    WRTX2 15    20 
    WRTX2 20    25 
    WRTX2 25    30 
    WRTX2 30    1005 
    WRTX2 1005   1010 
    WRTX2 1015   1020 
    WRTX3 5    10 
    WRTX3 10    15 
    WRTX3 15    20 
    WRTX3 20    25 
    WRTX3 25    1505 
    WRTX3 1505   1510 
    WRTX3 1510   1515 
    WRTX4 5    10 
    WRTX4 10    15 
    WRTX4 15    20 
    WRTX4 20    25 
    WRTX4 25    2005 
    WRTX4 2005   2010 
    WRTX4 2010   2015 
    WRTX4 2020   2025 

Haben Sie eine Idee, wie Sie mein Problem lösen können? Am liebsten würde ich diese Lösung in SQL Server machen, aber ich hatte nur wenig Erfahrung in Schleifen und Cursoren, die in diesem Fall möglicherweise nützlich sein könnten. Einmal habe ich sogar einen ETL gemacht, aber es funktionierte nur, wenn es nur einen Punkt gab, an dem sich die Route spaltete.

Ich wäre dankbar für jede Hilfe.

+0

Ist dies wirklich ein Diagramm oder eine Hierarchie von links nach rechts? Es sieht so aus, als würden Sie nach allen * Blättern * und ihrem Pfad zum Stamm fragen. Sie könnten eine [hierarchyid] hinzufügen (https://msdn.microsoft .com/de-us/library/bb677290.aspx) Jeder hierarchyid-Wert codiert im Wesentlichen den Pfad zum Stamm und konvertiert Hierarchiesuchen in Bereichssuchen.Das bedeutet, dass Sie einen Index für eine hierarchyid-Spalte verwenden können, um die Suche zu beschleunigen –

+0

Die [Konvertieren einer Tabelle in eine hierarchische Struktur] (https://msdn.microsoft.com/en-us/library/bb677237.aspx) tu torial zeigt, wie Sie eine Eltern/Kind-Tabelle in eine Tabelle mit hierarchyid-Spalten konvertieren können. –

Antwort

0

Nicht alle Aktionen, die Sie in SQL programmieren müssen. Es gibt keine universellen Programmiersprachen. Einige Aktionen müssen in anderen Programmiersprachen ausgeführt werden. Für Ihre Aufgaben ist es besser geeignet, zusätzlich Python mit SQL-Datenbanken zu verwenden.

Sie können eine Zeile in Python bearbeiten und in die Datenbank einfügen. Können Sie ein Beispielskript geben, aber Sie müssen die richtige Zeichenfolge "5-25-30-50 WRTX1 5-25-30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 WRTX4" und korrigieren Beispiel einer Daten Tabelle.

In Ihrer Tabelle gibt es die Nummer 10, aber sie sind nicht in der Zeile oben. In diesem Zusammenhang, verstehe nicht den Mechanismus der Zerlegung der Schnur "5-25-30-50 WRTX1 5-25-30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 WRTX4". Zum Beispiel: "5-25-30-50 WRTX1" zersetzen "" 5 25 WRTX1" , "" 25 30 WRTX1" , "" 30 50 WRTX1" Und so weiter?

Beispiels für python + MSSQL

import pymssql 
import re 
ServName = 'YourMSSQLServName' 
DBName = 'YourDBName' 

conn = pymssql.connect(server=ServName, database=DBName) 
cursor = conn.cursor() 
querytxt = ''' 
INSERT INTO [routing] 
      ([routeID] ,[originNodeID] ,[destinationNodeID]) 
VALUES 
      ('@routeID', @originNodeID , @destinationNodeID)''' 
limit = 1000 
Mask = 'WRTX' 
F = open('rote.txt', 'r') 
L = [R.strip() for R in F] 
for Line in L: 
    LineLast = Line 
    j = 1 
    while len(LineLast) != 0: 
     PingLines = LineLast.partition(Mask)[0].strip() 
     LineTemp = LineLast.partition(Mask)[2].strip() 
     Num = LineTemp[0]  
     LineLast = LineTemp.partition(' ')[2] 
     PingSet = PingLines.split('-')   
     i = 0 
     while i < len(PingSet)-1: 
      Ping1 = PingSet[i] 
      Ping2 = PingSet[i+1] 
      i = i + 1    
      routeID = Mask + Num 
      originNodeID = Ping1 
      destinationNodeID = Ping2 
      print('Mask = %s\tPing1 = %s\tPing2 = %s' % (routeID , originNodeID, destinationNodeID)) 
      query = querytxt.replace('@routeID', routeID) 
      query = query.replace('@originNodeID', originNodeID) 
      query = query.replace('@destinationNodeID', destinationNodeID) 
      cursor.execute(query) 
      conn.commit() 
      if i >= limit : break   
     j = j + 1 
     if j >= limit : break 
F.close() 
+0

Eine imperative Sprache kann mit einem Element gleichzeitig arbeiten. Eine relationale Datenbank arbeitet mit * Mengen * von Daten, gleichzeitig benötigt man eine imperative Sprache, um ein paar Zeilen zu verarbeiten und viel besser skalieren zu können. Eine Graphdatenbank wird noch schneller sein. Es gibt * Techniken für den Umgang mit Graphen, Hierarchien und Netzwerken in SQL.Manchmal können Sie viel bessere Leistung für Hierarchien mit einer relationalen Datenbank und zB verschachtelte Mengen, die Sie mit einer imperativen Sprache und Rekursion –

+0

können Ich stimme zu, dass es keine universellen Programmiersprachen. –

+0

Für dieses spezielle Problem, auch im Imperativ Sprachen müssen Sie die geeigneten Algorithmen für das Baum- oder Graphengehen finden. Eine einfache Schleife oder Rekursion würde zu einer Endlosschleife führen, wenn im Diagramm sogar nur eine einzige Schleife vorhanden wäre. Auch wenn es mehrere kleine Bäume gibt, warum alle * Knoten überprüfen, wenn nur die Blätter von Interesse sind? Selbst wenn wir nur die Blätter überprüfen, wie vermeidest du es, die Hierarchie für jeden von ihnen zur Wurzel zu machen? –

Verwandte Themen