关于SQLSERVER 查询的问题

wzview 2010-03-09 10:08:17
大家好 最近遇到点麻烦 请大家帮忙 如下 :

我在一个学生的数据库 STU 中查询STUDENTS 表中 相关的数据

CREATE TABLE STUDENTS
(
ID INT IDENTITY(1,1) PRIMARY KEY ,
[NAME] VARCHAR(20) NOT NULL,
[CLASS] VARCHAR(10) NOT NULL,
SEX INT NOT NULL, -- 0或1
)

比如 根据 班级 性别 查询姓名

SELECT NAME FROM STUDENTS WHERE SEX=1 AND CLASS ='01班'

查询出 3000 条数据

分两次提取

我第一次需要 2000 条 TOP 2000

第二次 我需要剩下的 1000 然后 TOP 1000 ....NOT IN... TOP 2000

我以为这样可以达到我希望的结果 但是

两次查出的数据有很多重复的

或许有 朋友会说 你笨啊 怎么不加 ORDER BY ID

我也知道 但是 ORDER BY 后 速度会相当的慢

所以在这里 求助啦 先谢谢大家啦
...全文
129 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzview 2010-03-11
  • 打赏
  • 举报
回复
我还是决定采用 ORDER BY 了 也没找到什么更好的办法 呵呵

谢谢所有关注此问题的朋友 尤其是 多次留言的朋友 !

在下对各位的热情帮助 感激不尽

如果哪位需要 虚拟主机 什么的找我 我绝对给最大的优惠 !!!

真心的谢谢所有 乐于助人的 朋友 !!!
liqiang8 2010-03-11
  • 打赏
  • 举报
回复
exists 呵呵
liqiang8 2010-03-11
  • 打赏
  • 举报
回复
可以考虑where not exsits,百万级数据性能还可以,再多数据就不敢保证了。
liqiang8 2010-03-11
  • 打赏
  • 举报
回复
3000条数据order by 无所谓。如果太多可以考虑临时表。将前2000条放入临时表。
wzview 2010-03-09
  • 打赏
  • 举报
回复
出了本帖中出现的高手外,正在期待其他高手的出现......
wzview 2010-03-09
  • 打赏
  • 举报
回复
引用 16 楼 dawan_252288924 的回复:
楼主先把Top2000放到一个临时表里好了


不行啊 如果两次是连着 提取还行 如果今天 查 500 程序关闭 明天再查 500 那临时表还能一直保存着啊

呵呵 谢谢啦
dawan_252288924 2010-03-09
  • 打赏
  • 举报
回复
楼主先把Top2000放到一个临时表里好了
wzview 2010-03-09
  • 打赏
  • 举报
回复
引用 14 楼 sql77 的回复:
引用 13 楼 wzview 的回复:引用 12 楼 sql77 的回复:SQL codeSELECTDISTINCTTOP1000 NAMEFROM TBWHERE NAMENOTIN (SELECTTOP2000 NAMEFROM TB) 楼主可以修改一下呀 呵呵 这样不行啊 因为第一次的 TOP 2000 和第二次的 TOP 2000 返回的结果不一样啊 没有 ORDER BY 返回是随机的 ! 呵呵
那楼主还是加个自增列或把ID聚集索引吧


有自增列啊 ID INT IDENTITY(1,1) 就是自增的啊 呵呵

还有 聚集索引怎么建啊 好久没有用过索引了 我以前学索引的时候 我们基本上就不用 忘了

谢谢
SQL77 2010-03-09
  • 打赏
  • 举报
回复
引用 13 楼 wzview 的回复:
引用 12 楼 sql77 的回复:SQL codeSELECTDISTINCTTOP1000 NAMEFROM TBWHERE NAMENOTIN (SELECTTOP2000 NAMEFROM TB) 楼主可以修改一下呀

呵呵 这样不行啊 因为第一次的 TOP 2000 和第二次的 TOP 2000 返回的结果不一样啊

没有 ORDER BY 返回是随机的 ! 呵呵

那楼主还是加个自增列或把ID聚集索引吧
wzview 2010-03-09
  • 打赏
  • 举报
回复
引用 12 楼 sql77 的回复:
SQL codeSELECTDISTINCTTOP1000 NAMEFROM TBWHERE NAMENOTIN
(SELECTTOP2000 NAMEFROM TB)

楼主可以修改一下呀


呵呵 这样不行啊 因为第一次的 TOP 2000 和第二次的 TOP 2000 返回的结果不一样啊

没有 ORDER BY 返回是随机的 ! 呵呵

SQL77 2010-03-09
  • 打赏
  • 举报
回复
SELECT DISTINCT TOP 1000 NAME
FROM TB WHERE NAME NOT IN
(SELECT TOP 2000 NAME FROM TB)


楼主可以修改一下呀
wzview 2010-03-09
  • 打赏
  • 举报
回复
引用 6 楼 sql77 的回复:
SQL codeSELECTTOP1000 NAMEFROM (SELECTDISTINCTTOP2000 NAMEFROM TB)AS T


这个不可行 还是谢谢了
wzview 2010-03-09
  • 打赏
  • 举报
回复
3000 只是个例子 如果是30000 或者 300000 呢 呵呵 !

速度慢的惊人啊
自由的企鹅 2010-03-09
  • 打赏
  • 举报
回复
会不会你的机器性能的问题呢,才几千条数据而已
东那个升 2010-03-09
  • 打赏
  • 举报
回复
引用 7 楼 ldslove 的回复:
集合运算符EXCEPT。 从左查询中返回右查询没有找到的所有非重复值。

我估计更慢。。。。
东那个升 2010-03-09
  • 打赏
  • 举报
回复
集合运算符EXCEPT。 从左查询中返回右查询没有找到的所有非重复值。

SQL77 2010-03-09
  • 打赏
  • 举报
回复
SELECT TOP 1000 NAME FROM (SELECT DISTINCT TOP 2000 NAME FROM TB)AS T
--小F-- 2010-03-09
  • 打赏
  • 举报
回复
可以考虑加个聚集索引....
sql_db 2010-03-09
  • 打赏
  • 举报
回复
order by 是必须的,可以考虑在id上建索引
bancxc 2010-03-09
  • 打赏
  • 举报
回复
速度不会相当的慢 只有3000数据
加载更多回复(2)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧