1. 程式人生 > >SQL的經典算法

SQL的經典算法

tput number detail 轉換 not exec ltrim 分頁 進入

1 SQL分頁查詢,每頁10個數據,取第三頁

A) 如果有id列

select top(10) * from Spider_Hotel

where Spider_Hotel.HotelId not in

( select top (10*2) Spider_Hotel.HotelId from Spider_Hotel)

B) 如果沒有id列

select top (10) * from

(select ROW_NUMBER() over (order by Name) as Row,* from Spider_Hotel)

a

where Row>10*2

C) 如果有id列

select top (10) * from Spider_Hotel

where HotelId >(select max(HotelId)

from (select top (10*2) HotelId from Spider_Hotel order by HotelId) as a

)

2,數據庫刪除重復記錄。

a, 如果有id列 a,b,c 重復

Delete from table where id not in (select max (id) from table group a,b,c)

b, 如果沒有id列a,b,c 重復 .用row_number() over 函數,制造個Id列

With Tab as

Select row_number() over (order by a) as Row,a,b,c from table

Delete from Tab

Where Row not in (selete max(Row) from Tab group a,b,c)

3,Count函數。

SELECT COUNT(*),COUNT(FNumber),COUNT(FName) FROM T_Employee

COUNT(*)統計的是結果集的總條數,而

COUNT(FName)統計的則是除了結果集中FName 不為空值(也就是不等於NULL)的記錄的總

條數,如果Fname有為空COUNT(*) 不等於COUNT(FNumber)

4,求一公司年齡在20-30,40-60歲這兩個年齡段的人數,行列轉換

select SUM(Young) as Young ,SUM(Old) as Old from (

select

Users_age,

sum(case when Users_age between 1 and 3 then 1 else 0 end) as Young,

sum(case when Users_age between 4 and 6then 1 else 0 end) as Old

from Users

group by Users_age) as s

// 顯示名字,不顯示人數,我感覺數據庫語句是一個一個判斷下去的

select

years,

case when age between 20 and 30 then name else ‘---‘ end as [20-30],

case when age between 30 and 40 then name else ‘---‘ end as [30-40],

case when age between 40 and 50 then name else ‘---‘ end as [40-50]

from info

group by years,name,age

5,連續三天的記錄 (查詢連續三天抽取同一家酒店同一入住時間的免費房的人員記錄)

select Member_Code from

dbo.Member a where

exists

(

select * from Member b

where b.Register_Date = DATEADD(D,1,a.Register_Date) and a.Member_Code=b.Member_Code

)

and

exists

(

select * from Member b

where b.Register_Date = DATEADD(D,2,a.Register_Date) and a.Member_Code=b.Member_Code

)

group by Member_Code

6,查詢表結構 (查詢一個數據庫所有的數據庫表 字段類型 字段大小)

--查詢表結構

select Dense_Rank() over (order by o.name) as table_order, ROW_NUMBER() over (partition by o.id order by o.name) as column_order,

o.name as table_name, c.name as column_name, t.name+‘[‘+ convert(varchar, c.[length])+‘]‘ as column_type

from sysobjects o inner join syscolumns c

inner join systypes t on c.xusertype=t.xusertype

on o.id=c.id

where o.xtype=‘U‘

order by o.name

--查詢數據庫表

select * from dbo.sysobjects

where sysobjects.xtype =‘U‘

--查詢數據庫列

select * from syscolumns

where id=21575115

7,截止今天的銷售額 (一個超市每天都有營業額。列出每天的營業額和截止到每天的總營業額。)

(比如,第一天 營業額 10 總營業額 10,第二天 營業額20 總營業額 30;第二天 營業額 10 總營業額 40)

select dates,(select SUM(moneys) from Table as TT

where TT.dates <= T.dates) from Table as T

8,全局臨時表,防止用戶兩地登錄。

--全局臨時表防止用戶地登錄,但是如果用戶量大,這很可能消耗大量資源。

--用戶登錄,就根據用戶Id創建個臨時表,如果用戶賬戶異地登錄,就會發現

--這張臨時表已經存在,返回,提示登錄不成功。用戶退出系統後,臨時表自動消失。

alter proc gp_findtemptable

@v_userid varchar(6),@i_out int output

as

declare @v_sql varchar(100)

if object_id(‘tempdb.dbo.##‘+@v_userid) is null

begin

set @v_sql = ‘create table ##‘+@v_userid+‘(userid varchar(6))‘

exec (@v_sql)

set @i_out = 0

end

else

set @i_out = 1

declare @I int

exec gp_findtemptable ‘T00001‘,@I output

select @I

9,查找指定節點的所有子節點的子節點。

create table os(id int,parentid int,desn varchar(10))

--自己不能是自己的節點,否則進入死循環。

alter function f_cid(@id int)

returns varchar(500)

as

begin

declare @t table(id int,desn varchar(10),parentid int,lev int)

declare @lev int

set @lev=1

insert into @t select *,@lev from os where id=@id

while(@@rowcount>0)

begin

set @lev=@lev+1

insert into @t select a.*,@lev from os a,@t b

where a.parentid=b.id and b.lev=@lev-1

end

declare @cids varchar(500)

select @cids=isnull(@cids+‘,‘,‘‘)+ltrim(id) from @t order by lev

return @cids

end

go

執行查詢

select *,ids=dbo.f_cid(id) from os

轉載:https://blog.csdn.net/slowlifes/article/details/7973904

SQL的經典算法