为了账号安全,请及时绑定邮箱和手机立即绑定

Sql Server 表别名的问题,在线等答案,急急急,求知道的大神解答一下

Sql Server 表别名的问题,在线等答案,急急急,求知道的大神解答一下

qq_遁去的一_1 2018-12-07 02:38:09
直接上代码吧,两段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贡献1780条经验 获得超5个赞

不能用o,

查看完整回答
反对 回复 2019-01-07
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

额,翔哥,好久不见,说具体点,我理解的意思大概是用o他指向的就是外面那个,查询的时候数据会不对,但是我搞不明白,你具体讲讲呗。

查看完整回答
反对 回复 2019-01-07
?
Qyouu

TA贡献1786条经验 获得超11个赞

@吴瑞祥

翔哥,人呢?吃饭去了?

查看完整回答
反对 回复 2019-01-07
?
米脂

TA贡献1836条经验 获得超3个赞

@晓菜鸟: 用o的时候挺乱,我也理不清,

1.执行from 连接3个表,左连接

2.执行where,执行子查询,子查询where的时候用外面的表.会有什么问题也是十分不清楚.

这个SQL谁写的?

查看完整回答
反对 回复 2019-01-07
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

@吴瑞祥: 一个同事写的,你也认识,接手你发短信的那个。用o的时候查询比较慢,而且数据不对。

查看完整回答
反对 回复 2019-01-07
?
开满天机

TA贡献1786条经验 获得超13个赞

@晓菜鸟: 这个子查询感觉上没任何必要......纯粹浪费性能的..

话说发短信那个东西还在维护?我以为我一走那就没人用了

查看完整回答
反对 回复 2019-01-07
?
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
查看完整回答
反对 回复 2019-01-07
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

@晓菜鸟: 嗯,这样写多好啊,把服务器升级成2012吧。有分页语句可以直接用啦。

不用写这么麻烦的分页了

查看完整回答
反对 回复 2019-01-07
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

用了O是对外面的order做限制  不用才是里面的查询条件限制

查看完整回答
反对 回复 2019-01-07
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我想知道他们在查询的时候会产生什么不同,原理是什么,您能详细讲解一下吗?

查看完整回答
反对 回复 2019-01-07
?
炎炎设计

TA贡献1808条经验 获得超4个赞

@晓菜鸟: 哦 ,我看过去的不同是:里面对外面的 order表限制(加了o)那么外面表符合where UserID=83863 的数据才会 进行 in判断

对里面的 order 表限制 同理就很好理解了

查看完整回答
反对 回复 2019-01-07
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

@风醉: 这个我能理解成"自连"吗?加o就是外面的表order要符合o.UserID=83863 且里面的order表的 TotalPrice>0 这样理解可以吗?

查看完整回答
反对 回复 2019-01-07
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

@晓菜鸟: 额,经测试觉得你的理解是正确的,碰到这种混乱的SQL 我建议 自己写个测试语句,对比看看一对多,多对多,多对一 的两个表,在这个查询得到的结果集有什么区别

查看完整回答
反对 回复 2019-01-07
  • 15 回答
  • 0 关注
  • 504 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信