我正在寻找数据库任务的帮助,这可能更容易通过某种对象编程语言来解决。此刻我一直在努力寻找它的TSQL / 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 WRTX2 5-25-30-1020 5月15-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 :(得分: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()