怎样实现如下数据库操作(VB.net):根据两张相关表的数据生成第三张表的数据!

whizstorm 2004-11-05 11:06:55
TableA TableB
Id Date Position Id Begin End Segment
1 11-04 Up 1 0.5 1.36 K111+0.5
2 11-03 Down 1 5.6 7.2 K111+5.6
1 8.9 11.6 K111+8.9
1 20.8 28.3 K111+20.8
2 2.6 12.6 K113+2.6

TableC
Id Date Position Begin1 End1 Segment1 Begin2 End2 Segment2
1 11-04 Up 0.5 1.36 K111+0.5 5.6 7.2 K111+5.6
1 11-04 Up 8.9 11.6 K111+8.9 20.8 28.3 K111+20.8
2 11-03 Down 2.6 12.6 K113+2.6 空 空 空

对TableA中的每一条记录,以Id作为关系,从TableB中选择相应的项,作为TableC的项,填到TableC中,若TableB中对应TableA的一条记录超过两条则在TableC中另起一条记录,若不足两条记录则空。见上图。
...全文
196 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_sun 2004-11-12
  • 打赏
  • 举报
回复
你可以得到开始表1和表2的公有字段 如 ID 在添加到表3上 OK
whizstorm 2004-11-12
  • 打赏
  • 举报
回复
TableB_Rows = TableA.Select("ID=" & TableA_Row("ID").ToString, "Begin") 是按Begin 的升序排列的,如果要按Begin的降序排列该怎么办呢?
scorpiowell 2004-11-12
  • 打赏
  • 举报
回复
可以的,我刚刚试了
scorpiowell 2004-11-12
  • 打赏
  • 举报
回复
排序,在后面加desc不知道行不行:
TableB_Rows = TableA.Select("ID=" & TableA_Row("ID").ToString, "Begin desc")
scorpiowell 2004-11-12
  • 打赏
  • 举报
回复
用代码如下:( dt2要按ID列排序好)
Dim dt1 As DataTable
Dim dt2 As New DataTable
Dim dt3 As New DataTable
绑定dt1和dt2,定义dt3表结构
...
Dim i As Integer
Dim j As Integer = 0
For i = 0 To dt1.Rows.Count - 1
For j = 0 To dt2.Rows.Count - 1
If dt1.Rows(i).Item(0) = dt2.Rows(j).Item(0) Then
Dim newRow As DataRow
newrow = dt3.NewRow
newrow.Item("ID") = dt1.Rows(j).Item(0)
newrow.Item("date") = dt1.Rows(i).Item("date")
newrow.Item("Position") = dt1.Rows(i).Item("Position")
newrow.Item("Begin1") = dt2.Rows(j).Item("Begin1")
...
If dt1.Rows(i).Item(0) = dt2.Rows(j + 1).Item(0) Then
newrow.Item("Begin2") = dt2.Rows(j + 1).Item("Begin2")
...
j = j + 1
Else
dt3.Rows.Add(newrow)
Exit For
End If
dt3.Rows.Add(newrow)
Else
Exit For
End If
Next
Next
你还是用楼上的好了,存储过程速度快!
jialiang 2004-11-12
  • 打赏
  • 举报
回复
我比较喜欢用存储过程,
思路:
第一步:先将A,B表通过ID关联的数据存储在临时表#t中,并生成自动增长ID
第二步:将每一组ID的最小的不是奇数的这组加一个数值保证将其改为奇数打头
第三步:通过将一组ID中的奇数组与跟其自动增长的ID大1的记录相连接,即生成所要的表
内容基本如下,
CREATE TABLE #t
( TmpID int IDENTITY(1,1) PRIMARY KEY,
AId INT,
ADate varchar(10),
Position varchar(10),
BBegin varchar(10),
BEnd varchar(10),
Segment varchar(10)
)

--第一步,将数据存储到临时表,以待处理
Insert Into #t (AID,Adate ,Position ,BBegin,BEnd,Segment)
select A.ID,A.date ,A.Position ,B.Begin,B.End,B.Segment
from A,B where A.id=B.id order by A.ID

--第二步:将以偶数开头的TmpID改为奇数
--取得最大ID,并确保为奇数,确保修改的ID唯一,
Select @MaxID = Max(TmpID) from #t
if (@MaxID%2)= 0
begin
set @MaxID=@MaxID+1
end
SET IDENTITY_INSERT #t on
Update #t Set TmpID= TmpID + @MaxID Where AID in
(Select AID from
(Select AID ,Min(TmpID) 'TmpID' from #t Group by AID having (Min(TmpID)%2) = 0) tmp
)
--第三步 生成要求的数据
insert into C(....)
Select t1.AID,t1.Adate ,t1.Position ,t1.BBegin,t1.BEnd,t1.Segment,t2.BBegin,t2.BEnd,t2.Segment
from #t t1 left join #t t2
on t1.Aid = t2.Aid and t1.Tmpid+1 = t2.tmpid and (t1.TmpID%2) > 0
水如烟 2004-11-09
  • 打赏
  • 举报
回复
好啦,自己看看,今晚得早点休息。
好运并进步。
水如烟 2004-11-09
  • 打赏
  • 举报
回复
有了A、B的数据才会有C的数据。DataSet里事先得有个C。
你可以用SELECT * FROM TableC WHERE 1<>1的语句来Fill(DataSet),这样就建了没数据的TableC了。
whizstorm 2004-11-09
  • 打赏
  • 举报
回复
TO:lzmtw(水如烟) TableC.AcceptChanges() 好像不行啊,我用 myDataAdapter.UpdatemyDataSet,"TableC") 才能使各项保存到TableC中,能解释一下吗??谢谢!!
水如烟 2004-11-08
  • 打赏
  • 举报
回复
即然能描述的出来当然也能做得出来
你想在数据库上来做还是想在DataSet上来做?
水如烟 2004-11-08
  • 打赏
  • 举报
回复
Order By ID,Begin?
水如烟 2004-11-08
  • 打赏
  • 举报
回复
对B的数据有没有顺序要求的?
dgz988 2004-11-08
  • 打赏
  • 举报
回复
不容易实现吧。。除非你如果你的条数是奇数怎么办?或是你的数据没有奇数的。
再就是在C表中最好要有一个标志性列。。
要非得实现,我觉得有两个方法可行,一个是把你的表再规划一下,加上标志性的列,按这个列来划分,还有就是用T-SQL或是存储过程,然后把选出来的ROW用UNION来连起来。。没试。。可能麻烦一些
whizstorm 2004-11-08
  • 打赏
  • 举报
回复
lzmtw(水如烟) Thank You very much!
whizstorm 2004-11-08
  • 打赏
  • 举报
回复
各位XDJM,很急啊,有人帮忙吗???
水如烟 2004-11-08
  • 打赏
  • 举报
回复
自己试试,我没测试过:

Sub GetTableCData(ByVal TableA As DataTable, ByVal TableB As DataTable, ByVal TableC As DataTable)
Dim TableA_Row As DataRow
Dim TableB_Rows As DataRow()
Dim TableB_Row As DataRow

Dim RowC_Row As DataRow
Dim i As Integer

For Each TableA_Row In TableA.Rows
TableB_Rows = TableA.Select("ID=" & TableA_Row("ID").ToString, "Begin")
i = 1
For Each TableB_Row In TableB_Rows
If i Mod 2 = 1 Then
Dim tmpCRow As DataRow = TableC.NewRow
TableC.Rows.Add(tmpCRow)
RowC_Row = tmpCRow

RowC_Row("ID") = TableA_Row("ID")
RowC_Row("Date") = TableA_Row("Date")
RowC_Row("Position") = TableA_Row("Position")
RowC_Row("Begin1") = TableB_Row("Begin")
RowC_Row("End1") = TableB_Row("End")
RowC_Row("Segment1") = TableB_Row("Segment")
Else
RowC_Row("Begin2") = TableB_Row("Begin")
RowC_Row("End2") = TableB_Row("End")
RowC_Row("Segment2") = TableB_Row("Segment")
End If
i += 1
Next
Next
TableC.AcceptChanges()
End Sub
whizstorm 2004-11-08
  • 打赏
  • 举报
回复
TO:lzmtw(水如烟) ( ) 信誉:100

我想在DataSet上实现
youlongzaitian 2004-11-05
  • 打赏
  • 举报
回复
说说我的思路吧!
先统计出TABLEAB中ID为1,2的记录总数,将一半记录与TABLEA关联取出,放在DATASET中,然后再将另外一半记录添加新列插入,最后将DATASET赋给TABLEC就OK了!
(仅供参考)
haoztao 2004-11-05
  • 打赏
  • 举报
回复
看来要做一个存储过程
fengyaner 2004-11-05
  • 打赏
  • 举报
回复
看来要做一个存储过程。
加载更多回复(1)

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧