我有两个相同的表
第一个表的结构就像一棵树,每个记录就像一个节点。
每个节点有三个字段包括:索引作为node-id, item 作为项目名称的表示,父母作为指针到上一个节点(索引)..
正如您可以在图片中看到的每个节点基于其父索引字段关系
相互关联现在我想做的是遍历每个节点(记录)到根,然后将它们安排到一个具有相同结构的新表,所以稍后在第二个表上会有 21记录如图所示
我正在使用vb.net并进行下一次循环以循环每行的索引,然后将每一行插入一个新表..但问题是我如何将数据从第一个表复制到第二个表条件亲子**
这是图片
这是我的伪代码
for i=1 to 11
checkindex = select * from 1st table where index = i
if checkindex.hasrows() then
traverse the row to its root then insert into 2nd table
end if
next i
所以我的问题是,基于我的伪代码,如何编码遍历每一行然后插入第二个表?
我正在使用mysql数据库和vb.net
感谢您的关注
我根据来自KJELL的PSEUDOCODE更新了我的编码
For node = 1 To maxnode
'QUERY A= FETCHING ROW/NODE FROM TABLE1 BASED ON INDEX
Dim node1 As String = "select indeks, item, parent from tree where indeks = '" & node & "' "
CMD_node = New MySqlCommand(node1, conn.konek)
hasilnode = CMD_node.ExecuteReader()
If hasilnode.HasRows Then
'QUERY B = FETCH PARENT VALUE FROM CURRENT ROW
Dim getpar1 As String = "select parent from tree where indeks = '" & node & "' "
CMD_getpar = New MySqlCommand(getpar1, conn.konek)
getpar = Convert.ToInt32(CMD_getpar.ExecuteScalar())
'QUERY C = INSERT CURRENT ROW(TABLE1) TO TABLE2
Dim rec_ins As String = "insert into node (indeks, item, parent, node_id) select indeks, item, parent, '" & node & "' from tree where indeks = '" & node & "' "
CMD_recs = New MySqlCommand(rec_ins, conn.konek)
CMD_recs.ExecuteNonQuery()
CMD_recs.Connection.Dispose()
'QUERY D = CHECKING IF CURRENT ROW'S PARENT = 0 (NOT EXIST) WITH PARENT VALUE ACHIEVED FROM QUERY B
If getpar <> 0 Then
'INSERT NEWROW WHERE NEWROW.INDEX = CURRENT ROW.PARENT
Dim rec_ins2 As String = "insert into node(indeks, item, parent, node_id) select indeks, item, parent, '" & node & "' from tree where indeks = '" & getpar & "' "
CMD_recs = New MySqlCommand(rec_ins2, conn.konek)
CMD_recs.ExecuteNonQuery()
CMD_recs.Connection.Dispose()
End If
'Else
'Continue While
'End If
'End While
Else
Continue For
CMD_getpar.Connection.Dispose()
End If
CMD_node.Connection.Dispose()
Next node
CMD_list.Connection.Dispose()
此代码生成的结果就像我的插图但 table1中的每个当前行仅调用前一行一次,结果就像每一行一样表1(除父行1的行除外)只在table2中生成两行,这是所希望的结果应该是:表1中的每一行在table2中生成不同的行数,根据父指数关系
例如table1中的行“3 A 2”,应该在table2中生成结果:
3 A 2
2 F 1
1 C 0
但我的代码只返回:
3 A 2
2 F 1
和其他行生成相同的结果,仅 2行
答案 0 :(得分:0)
你需要一个递归函数,它负责深度复制对象,如下所示:
您应该查询表1中的所有对象,并在循环中调用递归深层复制函数。
希望这对你有意义......
recurvise函数可能如下所示:
function storeMe(content) {
storeToDb(content)
myParentID = content[parent]
if (myParentID != 0) {
parentContent = getParentContent(myParentID)
unset(parentContent[lineID])
storeMe(parentContent)
}
}
主要功能如下:
myObjects = getAllFromTable1()
for(myObjects) {
storeMe(object)
}
这里有一个重要的事情:如果你的table1为数据库中的每一行使用唯一的id,你必须在存储父项时取消设置它,所以一个新的元素被写入数据库而不是一遍又一遍地更新。