直接上代码吧,两段sql,sql语句的有些where条件被我删除掉了,不然解释起来太麻烦。
问题就是:注意两段sql绿色的部分,用这个 o 和不用 o 的不用点在哪里?查询结果不一样又是为什么?能讲解一下原理最好,谢谢大家!
一:子查询里面使用 o.UserID,查询结果只有一条.
select
o.id Id,
c.name CompanyName ,
u.phone Phone ,
o.TotalPrice TotalPrice
from [order] o
left join [dbo].[CompanyInfo] c on o.userid=c.id
left join [dbo].[user] u on o.userid=u.id
where o.[ID] in ( select top (10) id from
(
select id,ROW_NUMBER() over(order by id desc) r from [order]
where o.UserID=83863 and TotalPrice>0
) t where t.r> (0))
二:子查询里面直接使用 UserID,查询结果不止10条
select
o.id Id,
c.name CompanyName ,
u.phone Phone ,
o.TotalPrice TotalPrice
from [order] o
left join [dbo].[CompanyInfo] c on o.userid=c.id
left join [dbo].[user] u on o.userid=u.id
where o.[ID] in ( select top (10) id from
(
select id,ROW_NUMBER() over(order by id desc) r from [order]
where UserID=83863 and TotalPrice>0
) t where t.r> (0))
15 回答
米脂
TA贡献1836条经验 获得超3个赞
@晓菜鸟: 用o的时候挺乱,我也理不清,
1.执行from 连接3个表,左连接
2.执行where,执行子查询,子查询where的时候用外面的表.会有什么问题也是十分不清楚.
这个SQL谁写的?
MM们
TA贡献1886条经验 获得超2个赞
@吴瑞祥: 嗯,是的,我就是为了弄清楚他们的区别,这个sql我已经优化了,发上来你看一下,短信那个没删,目前短信通道还算可以,所以也没怎么维护.
WITH orderdetail AS ( select o.id Id,c.name CompanyName ,u.phone Phone o.TotalPrice TotalPrice ,ROW_NUMBER() OVER(order by o.[ID] desc) rownum from [Order] o left join [CompanyInfo] c on o.UserID=c.ID left join [User] u on o.UserID=u.ID where u.ID=83863 and o.TotalPrice>0 ) select * from orderdetail where rownum between 1 and 30
炎炎设计
TA贡献1808条经验 获得超4个赞
@晓菜鸟: 哦 ,我看过去的不同是:里面对外面的 order表限制(加了o)那么外面表符合where UserID=83863 的数据才会 进行 in判断
对里面的 order 表限制 同理就很好理解了
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
@风醉: 这个我能理解成"自连"吗?加o就是外面的表order要符合o.UserID=83863 且里面的order表的 TotalPrice>0 这样理解可以吗?
慕莱坞森
TA贡献1810条经验 获得超4个赞
@晓菜鸟: 额,经测试觉得你的理解是正确的,碰到这种混乱的SQL 我建议 自己写个测试语句,对比看看一对多,多对多,多对一 的两个表,在这个查询得到的结果集有什么区别
- 15 回答
- 0 关注
- 504 浏览
添加回答
举报
0/150
提交
取消