以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]相同结构的几个表相同列内容集合到一个临时表格中!  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=141717)

--  作者:bashanren
--  发布时间:2019/10/9 15:37:00
--  [求助]相同结构的几个表相同列内容集合到一个临时表格中!
各位老师下午好!
在我的项目中有“GMYS”和“GMYX”、“SUKUJS”三个表格中均有“XZMC”、“XJHZXM”、“XJHZDH”、“XJHZZW”四列,数据类型均为字符型。想将三个表的相同列的内容集合到一个临时表中,我以下的代码已经建立了临时表,并将“GMYX”表格中的相关联内容集到该临时表中,不知怎么加写代码才能将其他两个表的相关内容也集合到该临时表,要求:“XZMC”(乡镇名称)下的“XJHZXM”(河长姓名)只集合一次,即同一乡镇的河长姓名不重复。请老师指导,谢谢!!

Dim dtb As New DataTableBuilder("XJHHZLSHZB","乡级河湖长临时汇总表")
dtb.AddDef("xzMC",Gettype(String),4,"","乡镇名称")
dtb.AddDef("xjhzXM",Gettype(String),6,"","乡级河长姓名")
dtb.AddDef("xjhzTEL",Gettype(String),11,"","乡级河长电话")
dtb.AddDef("xjhzZW",Gettype(String),20,"","乡级河长职称")
dtb.Build()
\'MainTable = Tables("XJHHZLSHZB")

\'--------------------以下是根据河长姓名查找所在乡镇的代码:
For Each nm1 As String In DataTables("GMYX").GetValues("XJHZXM")
    Dim dr1 As DataRow = DataTables("XJHHZLSHZB").AddNew()
    dr1("xjhzXM") = nm1
    For Each dr2 As DataRow In DataTables("GMYX").DataRows
        If dr2("XJHZXM") = nm1 Then
            dr1("xzMC") = dr2("XZMC")
            dr1("xjhzTEL")=dr2("xjhzdh")
            dr1("xjhzZW")=dr2("xjhzzw")
        End If
    Next
Next
  

--  作者:狐狸爸爸
--  发布时间:2019/10/9 15:43:00
--  
相同结构的,用sql语句合并比较快捷:

 Select XZMC,XJHZX,MXJHZDH, XJHZZW Fro m  表1  Union Sel ect XZMC,XJHZX,MXJHZDH, XJHZZW Fro m  表2  Union Se lect XZMC,XJHZX,MXJHZDH, XJHZZW Fro m  表3

五、UNION 运算符

UNION运算符用于组合两个查询的结果。
例如有一个客户表,一个供应商表,我需要得到所有在中国的客户和供应商的名称和地址。
因为数据位于不同的表中,显然,我们需要用两个查询才能完成任务:

SE LECT 公司名称, 地址 FR OM {客户} WHERE 国家 = \'中国\' UNION SEL ECT 公司名称, 地址 FR OM {供应商} WHERE 国家 = \'中国\'

两个查询的字段名称、个数、类型必须完全一致才行。

默认情况下,UNION会自动排除重复的行,然后你可以用ALL关键词来确保返回所有的行,例如:

S ELECT 公司名称, 地址 F ROM {客户} WHERE 国家 = \'中国\' UNION ALL SEL ECT 公司名称, 地址 F ROM {供应商} WHERE 国家 = \'中国\'


--  作者:bashanren
--  发布时间:2019/10/9 16:44:00
--  
谢谢“狐狸爸爸”的亲自指导,但我要的不只是一个简单合并,因为三个表及临时表的字段略有差异,还是想在我的那段代码中加写代码实现,还请老师们继续指导,谢谢!!
--  作者:狐狸爸爸
--  发布时间:2019/10/9 17:32:00
--  
既然结构不同,那么合并规则呢?

--  作者:bashanren
--  发布时间:2019/10/9 20:42:00
--  
按照“狐狸爸爸”的方法,我将代码修改如下,可提示出错。

Dim dtb As New DataTableBuilder("XJHHZLSHZB","乡级河湖长临时汇总表")
dtb.AddDef("xzMC",Gettype(String),4,"","乡镇名称")yif
dtb.AddDef("xjhzXM",Gettype(String),6,"","乡级河长姓名")
dtb.AddDef("xjhzDH",Gettype(String),11,"","乡级河长电话")
dtb.AddDef("xjhzZW",Gettype(String),20,"","乡级河长职称")
dtb.Build()

在论谈中发这段代码,总是出错,只好发图片了。

图片点击可在新窗口打开查看此主题相关图片如下:错误2.png
图片点击可在新窗口打开查看






运行后提示:

图片点击可在新窗口打开查看此主题相关图片如下:select错误.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2019/10/9 20:47:16编辑过]

--  作者:狐狸爸爸
--  发布时间:2019/10/9 20:50:00
--  
1、这个Slelect语句,不是代码,你要增加查询表:
http://www.foxtable.com/webhelp/topics/2321.htm

2、unio n语句必须结构相同,你的第一个select语句结构和后面就不同,解决办法,假定第一Select有A列,后面两个没有,你可以:
s elect a,b,c,d F rom 表1 U nion S elect "" as a,b,c,d F rom 表2 Un ion S elect "" as a,b,c,d Fr om 表3

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:sql.txt








[此贴子已经被作者于2019/10/9 20:50:30编辑过]

--  作者:bashanren
--  发布时间:2019/10/9 21:15:00
--  
非常感谢,辛苦“狐狸爸爸”了!
如果要在代码中添加代码将其他两个表的相关列内容熔合到这个临时表中呢?学习一下这个代码该如何写,谢谢!

Dim dtb As New DataTableBuilder("XJHHZLSHZB","乡级河湖长临时汇总表")
dtb.AddDef("xzMC",Gettype(String),4,"","乡镇名称")
dtb.AddDef("xjhzXM",Gettype(String),6,"","乡级河长姓名")
dtb.AddDef("xjhzDH",Gettype(String),11,"","乡级河长电话")
dtb.AddDef("xjhzZW",Gettype(String),20,"","乡级河长职称")
dtb.Build()
\'MainTable = Tables("XJHHZLSHZB")

\'--------------------以下是熔合几个表相关列内容的代码:

For Each nm1 As String In DataTables("GMYX").GetValues("XJHZXM")
    Dim dr1 As DataRow = DataTables("XJHHZLSHZB").AddNew()
    dr1("xjhzXM") = nm1
    For Each dr2 As DataRow In DataTables("GMYX").DataRows
        If dr2("XJHZXM") = nm1 Then
            dr1("xzMC") = dr2("XZMC")
            dr1("xjhzTEL")=dr2("xjhzdh")
            dr1("xjhzZW")=dr2("xjhzzw")
        End If
    Next
Next


--  作者:狐狸爸爸
--  发布时间:2019/10/9 21:35:00
--  
Dim dtb As New DataTableBuilder("XJHHZLSHZB","乡级河湖长临时汇总表")
dtb.AddDef("xzMC",Gettype(String),4,"","乡镇名称")
dtb.AddDef("xjhzXM",Gettype(String),6,"","乡级河长姓名")
dtb.AddDef("xjhzDH",Gettype(String),11,"","乡级河长电话")
dtb.AddDef("xjhzZW",Gettype(String),20,"","乡级河长职称")
dtb.Build()
For each dr1 As dataRow in DataTables("表1").DataRows
     Dim dr2 As dataRow in DataTables("XJHHZLSHZB").AddNew()
     dr2("xzMC") = dr1("xzMC")
     dr2("xjhzXM") = dr1("xjhzXM")
     dr2("xjhzDH") = dr1("xjhzDH")
     dr2("xjhzZW") = dr1("xjhzZW")
Next
For each dr1 As dataRow in DataTables("表2").DataRows
     Dim dr2 As dataRow in DataTables("XJHHZLSHZB").AddNew()
     dr2("xjhzXM") = dr1("xjhzXM")
     dr2("xjhzDH") = dr1("xjhzDH")
     dr2("xjhzZW") = dr1("xjhzZW")
Next

--  作者:bashanren
--  发布时间:2019/10/9 22:12:00
--  
辛苦“狐狸爸爸”!
您改的这个代码到是可以把两个表合到一个临时表中,可是,不能过滤相同行,要求“XJHZXM”(河长姓名)要按“XZMC”进行过滤,也就是说,假如A乡镇有多个“李明”的话,只在临时表中记一个,其他同名行要忽略,不同乡镇可以有同名。还请老师们帮忙修改,谢谢!!


再者:我将 Dim dr2 As dataRow in DataTables("XJHHZLSHZB").AddNew()修改成: Dim dr2 As dataRow DataTables("XJHHZLSHZB").AddNew()才可以运行。不然就错。
[此贴子已经被作者于2019/10/9 22:14:27编辑过]

--  作者:狐狸爸爸
--  发布时间:2019/10/9 22:22:00
--  
Dim dtb As New DataTableBuilder("XJHHZLSHZB","乡级河湖长临时汇总表")
dtb.AddDef("xzMC",Gettype(String),4,"","乡镇名称")
dtb.AddDef("xjhzXM",Gettype(String),6,"","乡级河长姓名")
dtb.AddDef("xjhzDH",Gettype(String),11,"","乡级河长电话")
dtb.AddDef("xjhzZW",Gettype(String),20,"","乡级河长职称")
dtb.Build()
Dim xms As New List(of String)
For Each dr1 As DataRow In DataTables("表1").DataRows
    If xms.Contains(dr1("xjhzXM")) = False Then
        xms .Add(dr1("xjhzXM"))
        Dim dr2 As DataRow = DataTables("XJHHZLSHZB").AddNew()
        dr2("xzMC") = dr1("xzMC")
        dr2("xjhzXM") = dr1("xjhzXM")
        dr2("xjhzDH") = dr1("xjhzDH")
        dr2("xjhzZW") = dr1("xjhzZW")
    End If
Next
xms.Clear
....