2017-02-09 45 views
0

我正在尋找數據庫任務的幫助,這可能會更容易通過一些對象編程語言來解決。此時我一直試圖找到它的TSQL/SQL Server解決方案。SQL Server中的網絡數據 - 標識單獨的路由

我使用一個包含有關路由數據的源表。每條記錄描述一條路由的鏈接,包括routeNo,originNodeID和destinationNodeID。從這個表中的數據的最複雜的例子看起來象下面這樣:

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 ....   .... 

所以,你可以看到每個路由ID描述不是線性的路線,但與分支路線。該例的路線可能是這樣的:

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

現在,我需要做的就是肢解這條路線不同的途徑:

5-25-30-50 WRTX1 5-25- 30-1020 WRTX2 1515年5月25日WRTX3 2025年5月25日WRTX4

對於每一個新的路線我只需要連接順序像下面的:

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 

你有任何想法如何解決我的問題?最好我想在SQL Server中製作這個解決方案,但我在循環和遊標方面只有很少的經驗,在這種情況下可能很有用。一旦我做了一個ETL,但它只在路線分裂只有一個點時才起作用。

我將不勝感激任何幫助。

+0

這是一個真正的圖形或從左到右顯示的層次結構嗎?它看起來像是要求所有*葉子*和它們到根的路徑,您可以添加[hierarchyid](https://msdn.microsoft .com/en-us/library/bb677290.aspx)。每個hierarchyid值本質上是對根的路徑進行編碼,將層次結構搜索轉換爲範圍搜索,這意味着您可以在hierarchyid列上使用索引來加快搜索速度 –

+0

[將錶轉換爲分層結構](https://msdn.microsoft.com/en-us/library/bb677237.aspx)tu torial展示瞭如何將父/子錶轉換爲具有hierarchyid列的表。 –

回答

0

並非所有您需要在sql中編程的操作。沒有通用的編程語言。某些操作需要在其他編程語言中完成。對於你的任務,它更適合於額外使用python與sql數據庫。

你可以在python中編輯一行並插入到數據庫中。你可以給一個腳本示例,但你必須帶上正確的字符串「5-25-30-50 WRTX1 5-25-30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 WRTX4」並修正一個數據的例子表。

在您的表格中有數字10,但它們不在上面的行中。在這方面,不理解字符串「5-25-30-50 WRTX1 5-25-30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 WRTX4」的分解機制。例如, 「5-25-30-50 WRTX1」 分解 「」 5 25 WRTX1" , 「」 25 30 WRTX1" , 「」 30 50 WRTX1" ?等等?

實施例用於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

一種命令式語言可以一次處理一個項目。一個關係數據庫可以處理* sets *數據,同時它需要一個命令式語言來處理幾行數據並且擴展得更好。圖形數據庫將會更快。 *有*技術用於處理SQL中的圖形,層次結構和網絡。有時候,對於具有關係數據庫和嵌套集的層次結構,您可以獲得更好的性能,您可以通過命令式語言和遞歸來獲得更好的性能 –

+0

我同意'沒有通用編程語言。' –

+0

對於這個特定問題,即使在命令行語言,你需要找到合適的樹或圖行走算法。如果圖形中只有一個循環,簡單循環或遞歸會導致無限循環。即使有多棵小樹,爲什麼只在感興趣的樹葉上檢查* all *節點?即使我們只檢查葉子,我們如何避免將層次結構上升到每個葉子的根目錄? –