2017-02-09 17 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 ....   .... 

Итак, как вы можете видеть каждый routeID описывает не линейный маршрут, но маршрут с ветвями. Маршрут из примера может выглядеть следующим образом:

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

Теперь, что мне нужно сделать, чтобы расчленить этот маршрут к отдельным маршрутам:

5-25-30-50 WRTX1 5-25- 30-1020 WRTX2 5-25-1515 WRTX3 5-25-2025 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

Действительно ли это график или иерархия слева направо? Похоже, вы запрашиваете все * leaves * и их путь к корню. Вы можете добавить [hierarchyid] (https://msdn.microsoft .com/en-us/library/bb677290.aspx). Каждое значение иерархии по существу кодирует путь к корню, преобразуя поиск иерархии в поиск диапазона. Это означает, что вы можете использовать индекс в столбце иерархии, чтобы ускорить поиск –

+0

[Преобразование таблицы в иерархическую структуру] (https://msdn.microsoft.com/en-us/library/bb677237.aspx) tu torial показывает, как вы можете преобразовать таблицу родителя/ребенка в таблицу с столбцами иерархии. –

ответ

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

Обязательный язык может работать с одним элементом за раз. Реляционные базы данных работают с * наборами данных, в то же время он требует императивного языка для обработки нескольких строк и масштабирования намного лучше. Графическая база данных будет еще быстрее. Существуют * методы для работы с графиками, иерархиями и сетями в SQL.Иногда вы можете получить гораздо лучшую производительность для иерархии с реляционной базой данных и, например, вложенными наборами, которые вы могли бы с императивным языком и рекурсией. –

+0

Я согласен, что «нет универсальных языков программирования». –

+0

Для этой конкретной проблемы даже в императивном языков, вам нужно найти соответствующие алгоритмы для ходьбы по деревьям или графам. Простой цикл или рекурсия приведут к бесконечному циклу, если на графике будет хотя бы один цикл. Даже если есть несколько маленьких деревьев, почему нужно проверять * все * узлы, когда интерес представляют только листья? Даже если мы проверяем только листья, как мы можем избежать иерархии до корня для каждого из них? –