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

引用 1 楼 maco_wang 的回复:

临时表效率不会太好
连接查询就可以了。

我还以为连接查询效率不如临时表呢?

作者: zizai0714   发布时间: 2011-06-16

引用 2 楼 zizai0714 的回复:

引用 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

SQL code

update 图书移除登记表 
set 图书移除登记表 .doid=T3.doid
from (select min(timeoff),DD.doid,DD.bid
 fromselect 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

引用 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,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

引用 8 楼 zizai0714 的回复:

引用 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

SQL嵌套是比较好的,但是也不要嵌套的太多了。那样会很麻烦的。

作者: qlong8807   发布时间: 2011-06-16