Sqlserver-with用法

with是什么就不再做赘述(一搜一大把),下面是几个case

--1.制造连续数字表
drop table Nums
CREATE TABLE Nums(n int NOT NULL PRIMARY KEY CLUSTERED)

WITH B1 AS(SELECT n=1 UNION ALL SELECT n=1), --2
B2 AS(SELECT n=1 FROM B1 a CROSS JOIN B1 b), --4
B3 AS(SELECT n=1 FROM B2 a CROSS JOIN B2 b), --16
B4 AS(SELECT n=1 FROM B3 a CROSS JOIN B3 b), --256
B5 AS(SELECT n=1 FROM B4 a CROSS JOIN B4 b), --65536
--..还可以继续,不过够用了
CTE AS(SELECT autonum=ROW_NUMBER() over(order by (select 1)) FROM B5 a CROSS JOIN B3 b) --65536 * 16
--select * from CTE
INSERT INTO Nums SELECT TOP(1000000) autonum FROM CTE --插入100万条数据

--2. 日历表
drop table calendar
CREATE TABLE Calendar(
date date NOT NULL PRIMARY KEY CLUSTERED,
weeknum int NOT NULL,
weekday int NOT NULL,
weekname nchar(3) NOT NULL,
workday bit NOT NULL
)

WITH CTE1 AS(
SELECT
date = DATEADD(day,n,'19991231')
FROM Nums
WHERE n <= DATEDIFF(day,'19991231','20501231')
),
CTE2 AS(
SELECT
date,
weeknum = DATEPART(week,date),
weekday = DATEPART(weekday,date)-1,
weekname = DATENAME(weekday,date)
FROM CTE1
)
--select * from CTE2
INSERT INTO Calendar
SELECT
date,
weeknum,
weekday,
weekname,
workday = CASE WHEN weekday IN (0,6) THEN 0 ELSE 1 END
FROM CTE2

--
select * from Calendar
3. 递归 树结构数据

with temp as
(
select hybm,hyms,sjhybm,hyjb from dmt_hydm where hybm = 010101 
union all 
select h.hybm,h.hyms,h.sjhybm,h.hyjb from dmt_hydm h,temp t where h.hybm=t.sjhybm
)
select * from temp order by hyjb

posted @ 2014-09-18 17:54  leiq  阅读(5024)  评论(0编辑  收藏  举报