mysql sql with as_SQL WITH AS用法实列

本帖最后由 惜 于 2018-11-29 20:39 编辑

SQL 查询所有用户最后一天的数据

[SQL] 纯文本查看 复制代码CREATE TABLE UserLog

(

UserId INT NOT NULL,

UpdateDate DATETIME NOT NULL DEFAULT GETDATE(),

[Action] VARCHAR(300) NOT NULL

)

GO

INSERT INTO UserLog(UserId,[Action])VALUES(1,'开始')

INSERT INTO UserLog(UserId,[Action])VALUES(1,'麦仁')

INSERT INTO UserLog(UserId,[Action])VALUES(1,'理事')

INSERT INTO UserLog(UserId,[Action])VALUES(1,'结束')

INSERT INTO UserLog(UserId,[Action])VALUES(2,'开始')

INSERT INTO UserLog(UserId,[Action])VALUES(2,'麦仁')

INSERT INTO UserLog(UserId,[Action])VALUES(3,'理事')

INSERT INTO UserLog(UserId,[Action])VALUES(4,'结束')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(1,DATEADD(hh,-99,GETDATE()),'开始')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(1,DATEADD(hh,-98,GETDATE()),'麦仁')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(1,DATEADD(hh,-97,GETDATE()),'理事')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(1,DATEADD(hh,-96,GETDATE()),'结束')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(2,DATEADD(hh,-95,GETDATE()),'开始')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(2,DATEADD(hh,-94,GETDATE()),'麦仁')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(3,DATEADD(hh,-93,GETDATE()),'理事')

INSERT INTO UserLog(UserId,UpdateDate,[Action])VALUES(4,DATEADD(hh,-92,GETDATE()),'结束')

GO

SELECT * FROM UserLog ul

GO

--显示数据如下:

22f0779a1bf6f8432985e5cddd2774b8.gif

19171211-8001e1f819eb43f7b0afab7911961edd.png (9.44 KB, 下载次数: 5)

2018-11-29 20:26 上传

[SQL] 纯文本查看 复制代码--第一步 根据用户分组 取日期最大值

WITH L AS

(

SELECT ul.UserId,convert(varchar(10),MAX(ul.UpdateDate),120) UpdateDate FROM UserLog ul GROUP BY ul.UserId

)

--第二步 左外连接 主表 匹配 用户和日期

SELECT ul.* FROM L l LEFT JOIN UserLog ul

ON l.UserId = ul.UserId AND CONVERT(VARCHAR(10),ul.UpdateDate,120) = l.UpdateDate

GO

--显示数据如下:

22f0779a1bf6f8432985e5cddd2774b8.gif

19171800-eeecd45af43746048f8d4fa74ff46ccc.png (5.72 KB, 下载次数: 4)

2018-11-29 20:26 上传

OK 想要的数据就这样查询出来了。

下面是另一个SQL CTE WITH AS 用法

[SQL] 纯文本查看 复制代码CREATE TABLE Menu

(

Id INT IDENTITY(1,1),

Parent INT NOT NULL,

[Name] VARCHAR(20) NOT null

)

GO

INSERT INTO Menu(Parent,[Name]) VALUES(0,'字典')

INSERT INTO Menu(Parent,[Name]) VALUES(1,'人')

INSERT INTO Menu(Parent,[Name]) VALUES(2,'男人')

INSERT INTO Menu(Parent,[Name]) VALUES(2,'女人')

--简化嵌套

WITH people AS

(

SELECT * FROM Menu m

)

SELECT * FROM people

go

--递归查询 父子类关系

WITH people AS

(

SELECT m.Id,m.Parent, m.[Name] FROM Menu m WHERE m.Id = 2

UNION ALL

SELECT m.Id, m.Parent, m.[Name] FROM Menu m INNER JOIN people p ON m.Parent = p.id

)

SELECT * FROM people

go

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值