sql批量查询插入的各种方法?
我换成最熟悉的图书管理系统中的问题来问(毕业设计做的就是这玩意)
这里有三个表A、B、C
其中表A(已从书馆中移除的图书)有四个属性aid(主键)、录入时间、doid(表示已经移除了)、B_id(图书移除登记id);
表B图书移除登记表有5个属性,bid(主键)、录入时间,录入人id,C_cid(图书id),;
表c就是图书表了,主键cid。
现在呢,在表B中多了一个属性doid,有的记录中有这个属性,有的没有。现在要将为空的doid填入一个值。这个属性的值来源就是选取表A中录入时间大于表B中录入时间并且离其最近A.录入时间所在的那条记录中的A.doid插入表B中,条件A.录入人=B.录入人
并且表B还要和表C通过图书id进行内联如果在表C中不存在此图书ID就不能更新表B中的相关记录。
我能想得的就是
select a.doid,timeoff=datediff(ss,aa.录入时间,A.录入时间),aa.bid,A.doid from
(select B.bid,B.录入时间,B.录入人 from 图书移除登记表 B innner join 图书表 C on b.C_cid=C.cid and B.doid<>'') aa,
已移除图书表 A where A.录入人=B.录入人 and A.录入时间>aa.录入时间
这样的话就是把合适的值都给选出来了。但是并不是最小值。而且感觉就算查出来了也很浪费时间,效率不高。
在今天晚上回来的路上,想了会,觉得用临时表是个不错的想法。不知道各位有什么好的方法?
作者: zizai0714 发布时间: 2011-06-16
连接查询就可以了。
作者: maco_wang 发布时间: 2011-06-16
临时表效率不会太好
连接查询就可以了。
我还以为连接查询效率不如临时表呢?
作者: zizai0714 发布时间: 2011-06-16
引用 1 楼 maco_wang 的回复:
临时表效率不会太好
连接查询就可以了。
我还以为连接查询效率不如临时表呢?
临时表是需要创建的,例如 select * into #t from tablename
或是create table #t(id int identity,colname varchar(20))
在SQL SERVER 2005+ 版本,比SQL SERVER 2000 多了一些函数和功能,大量减少了临时表和自定义函数的使用。
新建个表,折腾一下数据,如果数据多的话,会严重影响效率的。
作者: maco_wang 发布时间: 2011-06-16
update 图书移除登记表 set 图书移除登记表 .doid=T3.doid from (select min(timeoff),DD.doid,DD.bid from(select A.doid,timeoff=datediff(ss,aa.录入时间,A.录入时间),aa.bid,A.doid from(select B.bid,B.录入时间,B.录入人 from 图书移除登记表 B innner join 图书表 C on b.C_cid=C.cid and B.doid<>'') aa, 已移除图书表 A where A.录入人=B.录入人 and A.录入时间>aa.录入时间 )DD group by DD.doid,DD.bid) T3 where T3.bid= 图书移除登记表.bid
这样是不是很丑?
作者: zizai0714 发布时间: 2011-06-16
里面还有两个全角的括号。
表名和字段名中间有个. 后面怎么还有空格?
作者: maco_wang 发布时间: 2011-06-16
作者: maco_wang 发布时间: 2011-06-16
标题是:
SQL 批量查询插入的各种方法?
查询插入的意思是更新?
作者: maco_wang 发布时间: 2011-06-16
为什么标题和要问的内容不太一样?
标题是:
SQL 批量查询插入的各种方法?
查询插入的意思是更新?
刚准备改就发现你回复了。就改不了了。SQL code
update B set B.doid=DD.doid from(select min(timeoff),DD.doid,DD.bid from(select A.doid,timeoff=datediff(ss,B.date,A.date),B.bid from A,B inner join C on b.C_cid=C.cid and b.doid='' and A.recorder=B.recorder and A.date>B.date)DD group by DD.doid,DD.bid) where DD.bid= B.bid
这个还能改进么?
作者: zizai0714 发布时间: 2011-06-16
引用 7 楼 maco_wang 的回复:
为什么标题和要问的内容不太一样?
标题是:
SQL 批量查询插入的各种方法?
查询插入的意思是更新?
刚准备改就发现你回复了。就改不了了。SQL code
update B
set B.doid=DD.doid
from(select min(timeoff),DD.doid,DD.bid
from(select A.doid,t……
where 前面是不是少了个别名呀?
作者: maco_wang 发布时间: 2011-06-16
作者: qlong8807 发布时间: 2011-06-16