一些常用的sql

在做东西的时候 经常要加入很多测试数据,总不能一条一条的录吧

复制数据的sql,标记一下 免得又搞忘了。

INSERT INTO hospital (hospitalName,functionary,telphone,address,stateid,agencyid)
select hospitalName,functionary,telphone,address,stateid,agencyid FROM Hospital

mssql数据库自带的函数

遍历所有表

 

exec sp_msforeachtable 'select top 2 * from ?'

 偶然翻黄师兄的代码 记得有个 select count(*) from(select * from tb) 的来查询一个sql查询的记录行数 今天怎么写都不对

不得已又翻出来看 是 select count( *) from (select id from stuinfo) a   后面必须要带一个a 不然就不对

还可以这样 select a.* from (select * from stuinfo) a  哇 好神奇 以前没想到可以这样搞

 

今天考过滤有重名字的sql知道用聚合函数 结果把 聚合函数的过滤sql又搞忘了 是having ,>1代表有重复的

select stuname ,COUNT(id) from stuinfo group by stuname having count(id)>1

 

题里还出了啥写啥树状sql查询 我擦 这啥玩意 听都没听说过 ,网上一搜 还真有

原来叫啥CTE 公共表表达式 sqlserver2005里才有的。

来看一个例子:

create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , null  , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')

WITH Tree
AS
(
    SELECT id,pid,name FROM tb P WHERE P.Id = '003' -- parent id
    UNION ALL
    SELECT C.Id,C.pid,C.name FROM tb C
    INNER JOIN Tree T ON C.pid = T.Id
)
SELECT * FROM Tree

试了一下确实可以 好神奇 ,为什么这么神奇原理在哪里 以前我们都要用c#代码写递归的

关键在于那个with 刚刚说了CTE公共表表达式2005里才有的。 他的作用是with 出一个临时表 供后面使用

来个简单点的例子:

with ss
as
(select id from stuinfo where id>3)
select * from ss

这样简单噻 一看就明白 ,输出:

id
4
5
6

上面的异曲同工 ,奥妙就在于 在with括号里面的sql他又使用了with的临时变量 这样就形成了递归调用 ,所以可以查询出树状结构咯。

 

 

rownumber:

select ROW_NUMBER() over(order by id desc),id from stuinfo

 

关于删除重复数据的:

delete from stuinfo where stuname in( select stuname from stuinfo group by stuname  having count(id) >1) and
id not in(select min(id) from stuinfo group by stuname     having count(stuname)>1)

原理是首先count>1则代表有重复的 ,然后根据stunamegroup   只要>1则代表有多个同名stuname 。如果只是此条件则会把所有重名全部删除。

第二个子查询则是查询那些同名的最小id ,然后两个组合  删除所有重名的并把最小id排除不删。

posted @ 2010-09-28 11:00  assassinx  阅读(317)  评论(0编辑  收藏  举报