主题:SELECT的 in和 exists
seel
[专家分:250] 发布于 2008-05-20 01:10:00
在 gl_kxh 表中 查找 gl_kxh 列 中是否有 'AAA' 的记录:
SELECT COUNT(*) as kxh FROM gl_kxh WHERE kxh = 'AAA'
上面是我现在用的语句,随着表的数据量的增大,查询变得越来越慢,在网上查了一下,说COUNT(*)查询效率比较低,想改用 exists 或 in ,可是,写了几次老是出错,请各位老师给个代码,谢谢。
BTW: 我在gl_kxh表中已设置了索引,可是在查询中好像不起作用,Why ?
最后更新于:2008-05-20 01:18:00
回复列表 (共9个回复)
沙发
moz [专家分:37620] 发布于 2008-05-20 02:15:00
1. 记得在初学的时候看到帮助文档中的SQL中有一句解释:SQL会自动使用索引来加快查询速度......
到了今天,我已经不相信这一句话了。
也许这一句话说的是对的,但估计那个索引是临时建立起来的,而不是你已经建立好的那个。
2. 既然有索引,为什么不这样子试试:
SEEK "AAA"
COUNT WHILE kxh="AAA"
或
COUNT FOR kxh="AAA"
板凳
seel [专家分:250] 发布于 2008-05-20 08:31:00
Sorry, 忘说明了,数据库端为 SQL Server 2000
因此, Seek 对SQL是无效的
3 楼
seel [专家分:250] 发布于 2008-05-22 10:03:00
up........
4 楼
LuckyLine [专家分:1940] 发布于 2008-05-22 16:58:00
in 和 exists用于子查询,前者用于非相关查询,后者用于相关查询。你现在只有一张表,没有必要用子查询。
如果分两步走,看看效果如何。
1.先生成一张“tmpAAA”的表,只有一个列
2.计数
SELECT 某个列名 into table tmpAAA FROM gl_kxh WHERE kxh = 'AAA'
SELECT COUNT(*) as kxh FROM tmpAAA
我没有很多记录的表,只是想象而已。请试试看。
5 楼
cbl518 [专家分:57140] 发布于 2008-05-22 18:09:00
再存储过程中,用自连接方式!
6 楼
lbscyb [专家分:4780] 发布于 2008-05-25 23:49:00
在 gl_kxh 表中 查找 gl_kxh 列 中是否有 'AAA' 的记录:
SELECT gl_kxh as kxh FROM gl_kxh WHERE gl_kxh like '%AAA%'
SELECT gl_kxh as kxh FROM gl_kxh WHERE gl_kxh in ('AAA')
以上为SQL SERVER 语法
7 楼
l021126 [专家分:660] 发布于 2008-05-27 10:10:00
学习
8 楼
seel [专家分:250] 发布于 2008-06-11 20:21:00
sorry,最近在忙四川的事,未能及时回复and加分,请谅解!!!
找到问题所在了,是我建错了索引,要的没建,建的没用到 ^_^
9 楼
cbl518 [专家分:57140] 发布于 2008-06-11 21:12:00
速度绝对快:
SELECT 最短的字段名 FROM gl_kxh WHERE at('AAA',kxh)=1 into array An1
?"数量:",_Tally
我来回复