建议少用 in 和not in,在SQL里面,开销比较大
解决方案 »
- 开发的程序到其他机器 就连接不上数据库
- 错误提示:无法编辑该单元
- 求教两个表的排序问题,在线等
- 如何把一个库中的所有字段类型为numeric(18,0)的,字段名满足 %quantity% 的字段改为numeric(18,2)
- [急]ms sql server 2000安装到最后一步出错!
- 急急如律令请教:查询语句包含表名或函数名过多,超过最大256数目?
- 关于access改为mssql2000后代码出现错误相关解答,大家请进...
- 关于表记录删除问题!@!请大家!救命先!
- 关于Delphi前台与SQL 后台表格生成与联系的问题
- 如何将Excel文件格的数据转到Sql Server来,用代码实现!!
- SQLServer 表中某个字段 自动更新问题
- 抢分了——这个代码哪里错了?
select * from tablename where bm EXISTS ('1011','1533','1535',......) order by bm
select * from tablename where bm EXISTS ('1011','1533','1535',......) order by bm
建议其去看看相关的资料楼主的这个问题也可以用union进行连接查询
on a.bm=b.bm where b.bm is null order by bm
select * from tablename a left join (select '1011' bm union all select '1533' bm union all select '1535' bm union all select ......) b
on a.bm=b.bm where b.bm is not null order by bm
where A.bm = B.bm
order by A.bm 即可
就这样了.超时可能要在其它方面找原因.如:索引建立是否合理? 数据表是否频繁修改删除而索引长期没维护过.
真正的语句是不是这样?
表是否过于宠大?有没有分表或建分区视图的必要?
还有是不是语句查询时间本身不是很长,而你超时设置却很短.
按你的要求,这是最基础的T-SQL语句.很难有什么比它更快的了.
如果客户字符串实在太长,要在存储过程中处理,也是要用表变量:declare @bm table (bm varchar(10) primary key)
然后再联接.这也许快不了多少,或者还更慢.但你 用in (......)以经超时了,所以要在其它方面找原因.主要问题不在语句上.
SELECT YPBM=NR.BM, YPMC=NR.MC, NR.BZ, NR.GG,SF.YS,NR.DW,NR.BZS,NR.BZDW,
DJ=CASE WHEN ZY.BM IS NULL THEN CF.DJ ELSE ZY.DJ END,
SL=CASE WHEN ZY.BM IS NULL THEN CF.ZL ELSE CF.ZL * ZY.YL END,
JE=CASE WHEN ZY.BM IS NULL THEN CF.FY ELSE CF.ZL * ZY.FY END
INTO #TMP
FROM mz_sf200411 SF,mz_cf200411 CF
LEFT JOIN MZ_ZYCF ZY ON CF.CFID=ZY.CFID, ZD_MZCFNR NR
WHERE SF.SFID=CF.SFID AND SF.STATE & 0x85=0x04
AND NR.BM=CASE WHEN ZY.BM IS NULL THEN CF.BM ELSE ZY.BM END
AND CASE WHEN ZY.BM IS NULL THEN CF.LX ELSE 3 END IN (0,4)
AND NR.JB & 511>0x00 AND NR.JX IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50)
AND SF.SFRQ>=(DATEDIFF(DAY, '1899-12-30','2004-11-01'))
and SF.SFRQ<=(DATEDIFF(DAY, '1899-12-30','2004-11-30'))
AND NR.BM IN('3534','4554','3443','1244',......) --关键是这里,只能装12个数
go
SELECT B.MC '医生姓名',A.YPBM '药品编码', A.YPMC '药品名称', A.BZ '包装', A.GG '规格', A.DJ '单价',
消耗量1=ltrim(str(SUM(A.SL),len(str(SUM(A.SL))),2))+A.DW, 消耗量2=ltrim(str(sum(A.SL)/A.BZS,
len(str(sum(A.SL)/A.BZS)),2))+A.BZDW,金额=SUM(A.JE)
FROM #TMP A,ZD_RY B
WHERE A.YS=B.BM
GROUP BY A.YPBM, A.YPMC, A.BZ, A.GG,A.DJ,B.MC,A.DW,A.BZS,A.BZDW
ORDER BY A.YPBM
////////////////////////////////////////////////////
这个方法好!性能提高好多。