21路部落

吾辈之于21世纪前进的道路即为21路,所建之部落,即为21路部落 注册 | 登陆
Contact me!

huboy,于2004年03月15日创建此Blog,其间在 11 个分类中发表的 809 篇文章被评论了 298 次,总访问 4633847 次,今日 373 次

浏览模式: 标准 | 列表分类:SQL SERVER

sql查询100个栏目的前100个文章[转]

有这样一个问题:有100个栏目,要查出每个栏目的前100篇文章id,就是一共要查100x100=10000个id

怎么做呢?

我以前是手工的,不怕笑话,sql不太懂,我怎么做:

select  top 100 articleid from table where classid=1 

查一次把结果记下来,然后再查select  top 100 articleid from table where classid=2 再把结果记下来 然后继续 查100次  把100次的结果串起来

以前栏目不多的时候我就是这样做的,现在栏目多,快到100了,手工实在不行,要想办法了。到处找资料,到处问人,嘿,还真给我搞了几套方案。

1、union all

select  top 100 articleid from table where classid=1 
union all
select  top 100 articleid from table where classid=2
union all
select  top 100 articleid from table where classid=3
union all
...
select  top 100 articleid from table where classid=100

一次? 哈哈不行 太多了 查询分析报错 试了好多次都不能一次搞定  要分2次 从1-50  51-100 或者其他  反正要分隔成两次查 就不会报错。

2、利用循环

declare @i int
set @i=1
while @i<100begin
    select top 100 articleid from table
    where  classid=@i
    set @i=@i+1
end

这个可以一次查出来 但是结果显示非常不爽  全部是显示在一个框框一个框框里面 查一次就是一个结果框  没办法把结果全部copy出来

3、目前来看最好的方法

select articleid from table a
where articleid in (
select top 100 articleid from table
where classid=a.classid)

很简单就搞定了 牛人告诉我的 我看了半天不知道怎么理解  哈哈 没学过是菜鸟 大致意思就是查询一个articleid 判断它是不是在这个classid的前100个articleid里面 是就记录然后继续判断下一个articleid

4、我提出把方案2的思路改进 首先查一次top100 把得到的数据插入一个临时表 然后进行下一步查询下一个top100 把结果插入到刚才的临时表 然后继续 循环 最后把临时表的结果输出

可惜了我用的access数据库 临时表要用到存储过程 而access不支持 这个方案没搞到 哈哈  还有高人还帮我搞搞没有?

sql server 面试时 的考题!!(整理) [有答案,就不知道是否正确]

1.磁盘柜上有14块73G的磁盘, 数据库为200G 大小包括日志文件,如何设置磁盘(要说明这14磁盘是怎么用的)?
2.有两服务器群集,分别为node1和node2 现在要打win200系统补丁,打完后,要重新启动,如何打补丁,不能影响用户使用(要用群集的术语详细说明)。
3.有一个A 数据库,分别复制到B和C     B 要求 每次数据更新 也同时更新,C 每天更新一次就行,如何制定复制策略!
4.有一个order 表,有90个字段,20个索引,15个复合索引,其中有3个索引字段超过10个,如何进行优化
5.有一个数据库200G大小,每天增加50M 允许用户随时访问,制定备份策略(详细说明)。
6.管理50台数据库,日常工作是检查数据库作业是否完成,你该如何完成这项检查工作?
7.自定义函数和存储过程的区别是什么,什么情况下只能用自定义函数,什么情况下只能用存储过程
8.SQL 2005 的新特性是什么 ?     与oracle 有什么区别?
9.DBA 的品质应该有哪些,你有哪些, 有什么欠缺的?
10。如果想配置SQL Mail 应该在服务器安装哪些软件!

» 阅读全文

生成100万条8位不重复数据的示例

1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小

2.    控制不重复

3.    考虑性能

» 阅读全文

如何让你的SQL运行得更快

---- 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:

» 阅读全文

Tags: sql serverv, 效率

分级汇总实现的3种方法比较

代码:--------------------------------------------------------------------------------
select code 代码 , substrb('   ',1,item_level*2-2)││b.reg_type 登记注册类型, cnt 家数 from
(
(select substr(z01_08,1,1)││༼' code ,count(*) cnt
from cj601
group by substr(z01_08,1,1))
union
(select substr(z01_08,1,2)││Ɔ' code ,count(*) cnt
from cj601
group by substr(z01_08,1,2))
union
(select substr(z01_08,1,3) code ,count(*) cnt
from cj601
group by substr(z01_08,1,3))
)
c, djzclx b where c.code=b.reg_code;

» 阅读全文

查询计算每个地区亏损前10名的语句的写法

代码:--------------------------------------------------------------------------------
下面2个语句均可以达到计算亏损前10名的要求
 
SQL>select * from (select rank() over(order by b04_50) 名次, b04_50 "亏损总额" from cj604 where b04_50<-1000 ) where rownum<=10;

    名次   亏损总额
---------- ----------
      1  
      2  
      3  
      4  
      5  
      6  
      7  
      8  
      9  
    10  
   
SQL> select rownum 名次,a.* from (select b04_50 "亏损总额" from cj604 where b04_50<-1000 order by b04_50 ) a where rownum<=10;

» 阅读全文

Records:712