三.数据库合并问题
access里的两个表,想让两个表的内容合并
表[a]结构如下:
| [id] | 编号 | 自动编号 |
| [name] | 名称 | 文本 |
| [price] | 价格 | 数字 |
| [guige] | 规格 | 文本 |
| [changjia] | 生产厂家 | 文本 |
| [baozhuang] | 包装 | 文本 |
| [danwei] | 单位 | 文本 |
共有900条记录,除了id和name字段,其他均可以为空
表[b]结构如下:
| [id] | 编号 | 自动编号 |
| [name] | 名称 | 文本 |
| [price] | 价格 | 数字 |
| [changjia] | 生产厂家 | 文本 |
| [danwei] | 单位 | 文本 |
| [xingzhi] | 性质 | 文本 |
共有800条记录,除了id和name字段,比表[a]少几个字段,但还多一个[xingzhi]的字符安其它均可以为空
现在想生成一个新表[c],结构如下,而且内容是两个表的内容之和。
| [id] | 编号 | 自动编号 |
| [name] | 名称 | 文本 |
| [price] | 价格 | 数字 |
| [guige] | 规格 | 文本 |
| [changjia] | 生产厂家 | 文本 |
| [baozhuang] | 包装 | 文本 |
| [danwei] | 单位 | 文本 |
| [xingzhi] | 性质 | 文本 |
用sql语句也可以,手工操作也好,xml也好,别管怎么着吧,怎么实现呀,哥们要郁闷坏了,真要让我们再输入800条记录,我就挂了。
回答:
1.这样
| insert into c(id,name,.....) select id,name,..... from a insert into c(id,name,.....) select max(id)+1,name,..... from b |
2.更正:
如果直接在查询分析器里执行:
| insert into c(name,.....) select name,..... from a insert into c(name,.....) select name,..... from b |
3.用union方法
| insert into [c] ([id] ,编号,自动编号) select [id],编号,自动编号 from [a] union select [id],编号,自动编号 from [b] |
4.asp的解决办法
| <% '循环检测a表 set rs = server.createobect("adodb.recordset") rs.open "select * from a order by id",conn,1,1 do while not rs.eof call actadd(rs("name")) '调用像b表添加内容的函数! rs.movenext loop rs.close set rs = nothing sub actadd(txt) dim ts, sql sql = "insert into b(name) values('"& txt &"')" set ts = conn.execute(sql) ts.close set ts = nothing end sub %> |
5.asp的解决办法
| <% dim arr_temp1,arr_temp2,arr_data set rs=conn.execute("select id,name,price,guige,changjia,baozhuang,danwei from a") arr_temp1=rs.getrows rs.close set rs=nothing set rs=conn.execute("select id,name,price,guige,changjia,danwei,xingzhi from b") arr_temp2=rs.getrows rs.close set rs=nothing rem 开始处理 redim arr_data(ubound(arr_temp1,2)+ubound(arr_temp2,2),7) rem 把两个数组的内容复制进来 这一部分自己写了做两个循环 然后再存进数据库 %> |
最后转一些经典的sql语句:
1.蛙蛙推荐:一些精妙的sql语句
说明:复制表(只复制结构,源表名:a 新表名:b)sql: select * into b from a where 1<>1
说明:拷贝表(拷贝数据,源表名:a 目标表名:b)sql: insert into b(a, b, c) select d,e,f from b;
说明:显示文章、提交人和最后回复时间sql: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
说明:外连接查询(表名1:a 表名2:b)sql: select a.a, a.b, a.c, b.c, b.d, b.f from a left out join b on a.a = b.c
说明:日程安排提前五分钟提醒sql: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
说明:两张关联表,删除主表中已经在副表中没有的信息
sql: delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
说明:--
sql: select a.num, a.name, b.upd_date, b.prev_upd_date
from table1,
(select x.num, x.upd_date, y.upd_date prev_upd_date
from (select num, upd_date, inbound_qty, stock_onhand
from table2
where to_char(upd_date,'yyyy/mm') = to_char(sysdate, 'yyyy/mm')) x,
(select num, upd_date, stock_onhand
from table2
where to_char(upd_date,'yyyy/mm') =
to_char(to_date(to_char(sysdate, 'yyyy/mm') '/01','yyyy/mm/dd') - 1, 'yyyy/mm') ) y,
where x.num = y.num (+)
and x.inbound_qty + nvl(y.stock_onhand,0) <> x.stock_onhand ) b
where a.num = b.num
说明:--
sql: select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩
说明:
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
sql: select a.userper, a.tel, a.standfee, to_char(a.telfeedate, 'yyyy') as telyear,
sum(decode(to_char(a.telfeedate, 'mm'), '01', a.factration)) as jan,
sum(decode(to_char(a.telfeedate, 'mm'), '02', a.factration)) as fri,
sum(decode(to_char(a.telfeedate, 'mm'), '03', a.factration)) as mar,
sum(decode(to_char(a.telfeedate, 'mm'), '04', a.factration)) as apr,
sum(decode(to_char(a.telfeedate, 'mm'), '05', a.factration)) as may,
sum(decode(to_char(a.telfeedate, 'mm'), '06', a.factration)) as jue,
sum(decode(to_char(a.telfeedate, 'mm'), '07', a.factration)) as jul,
sum(decode(to_char(a.telfeedate, 'mm'), '08', a.factration)) as agu,
sum(decode(to_char(a.telfeedate, 'mm'), '09', a.factration)) as sep,
sum(decode(to_char(a.telfeedate, 'mm'), '10', a.factration)) as oct,
sum(decode(to_char(a.telfeedate, 'mm'), '11', a.factration)) as nov,
sum(decode(to_char(a.telfeedate, 'mm'), '12', a.factration)) as dec
from (select a.userper, a.tel, a.standfee, b.telfeedate, b.factration
from telfeestand a, telfee b
where a.tel = b.telfax) a
group by a.userper, a.tel, a.standfee, to_char(a.telfeedate, 'yyyy')
说明:四表联查问题:sql: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
说明:得到表中最小的未使用的id号
sql:select (case when exists(select * from handle b where b.handleid = 1) then min(handleid) + 1 else 1 end) as handleid
from handle
where not handleid in (select a.handleid - 1 from handle a)
2.删除重复数据
一、具有主键的情况
a.具有唯一性的字段id(为唯一主键)delete table
where id not in
(
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
b.具有联合主键
假设col1+','+col2+','...col5 为联合主键select * from table where col1+','+col2+','...col5 in (
select max(col1+','+col2+','...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
c:判断所有的字段select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
二、没有主键的情况
a:用临时表实现select identity(int,1,1) as id,* into #temp from ta
delete #temp
where id not in
(
select max(id) from # group by col1,col2,col3...
)
delete table ta
inset into ta(...)
select ..... from #temp
b:用改变表结构(加一个唯一字段)来实现alter table 表 add newfield int identity(1,1)
delete 表
where newfield not in
(
select min(newfield) from 表 group by 除newfield外的所有字段
)
alter table 表 drop column newfield
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器