请问各位大牛,exists判断加select和直接用inner join哪个性能好些呢?

e哥 2017-10-18 09:45:25
请问这两种写法是第1种好?还是第2种好
1、inner join:
declare @Uid int=39500,
@Pwd nvarchar(99)='1A01CE9B1656D7DC34F7BBB1FF2BA3FA2EA1973B';
select vMember.Uid,vMember.Mb,vMember.mail,vMember.Rid,vMember.Nm from vMember
inner join Members on vMember.Uid=Members.Uid
where Members.Uid=@Uid and Members.Pwd=@Pwd
2、exists:
declare @Uid int=39500,
@Pwd nvarchar(99)='1A01CE9B1656D7DC34F7BBB1FF2BA3FA2EA1973B';
if exists(select Uid from Members where Uid=@Uid and Pwd=@Pwd)
select * from vMember where Uid=@Uid
...全文
815 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
繁花尽流年 2017-10-19
  • 打赏
  • 举报
回复
引用 12 楼 QQ154485585 的回复:
declare @Input nvarchar(99)='13128988007', @Pwd nvarchar(99)='1A01CE9B1656D7DC34F7BBB1FF2BA3FA2EA1955B', @Uid int; select @Uid= Uid from vMember where Mb=@Input or mail=@Input select * from vMember where exists(select Uid from Members where Uid=@Uid and Pwd=@Pwd) and Uid=@Uid 再请教一下,两句select合在一个语句里好些吗?怎么合?
select * from vMember where exists(select Uid from Members where Uid=vMember.Uid and Pwd=@Pwd) and Uid=(select Uid from vMember where Mb=@Input or mail=@Input) 并不建议这么写
e哥 2017-10-19
  • 打赏
  • 举报
回复
declare @Input nvarchar(99)='13128988007', @Pwd nvarchar(99)='1A01CE9B1656D7DC34F7BBB1FF2BA3FA2EA1955B', @Uid int; select @Uid= Uid from vMember where Mb=@Input or mail=@Input select * from vMember where exists(select Uid from Members where Uid=@Uid and Pwd=@Pwd) and Uid=@Uid 再请教一下,两句select合在一个语句里好些吗?怎么合?
繁花尽流年 2017-10-19
  • 打赏
  • 举报
回复
引用 10 楼 QQ154485585 的回复:
[quote=引用 5 楼 zengertao 的回复:] 数据量少的时候inner join未必有啥优势。一旦上百万区别就明显inner join好些。 顺便LZ你1,2两个逻辑都不是一个东西啊。第二种应该是where exists (...)来写
zengertao说的是这样吧? declare @Uid int=39500, @Pwd nvarchar(99)='1A01CE9B1656D7DC34F7BBB1FF2BA3FA2EA1973B'; select * from vMember where exists(select Uid from Members where Uid=@Uid and Pwd=@Pwd) and Uid=@Uid[/quote] 对,前面没看清楚,以为你第二段语句会多取记录。
e哥 2017-10-19
  • 打赏
  • 举报
回复
引用 5 楼 zengertao 的回复:
数据量少的时候inner join未必有啥优势。一旦上百万区别就明显inner join好些。 顺便LZ你1,2两个逻辑都不是一个东西啊。第二种应该是where exists (...)来写
zengertao说的是这样吧? declare @Uid int=39500, @Pwd nvarchar(99)='1A01CE9B1656D7DC34F7BBB1FF2BA3FA2EA1973B'; select * from vMember where exists(select Uid from Members where Uid=@Uid and Pwd=@Pwd) and Uid=@Uid
e哥 2017-10-19
  • 打赏
  • 举报
回复
版主发那贴子里比较倾向于inner join
二月十六 版主 2017-10-19
  • 打赏
  • 举报
回复
引用 3 楼 QQ154485585 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 楼主可以根据自己的实际数据,看一下执行计划和效果。
看不懂啊 [/quote] 这俩是一个语句的执行计划吧?最后还是得根据楼主的实际数据看效果 http://bbs.csdn.net/topics/280075423#post-241435789
jingxiaoping 2017-10-19
  • 打赏
  • 举报
回复
看楼主主要想完成什么样的结果。 如果是关联查询的话第一个好一些,可以将相关联的数据进行结果展示,如果仅是查询第二个表是否有跟第一个表数据有关联关系,那么用第二个表就行,在使用过程中要尽可能 保证EXISTS后面的表在数据体量上面要小于第一个表。
繁花尽流年 2017-10-19
  • 打赏
  • 举报
回复
好吧写的挺绕,看花了还是一个意思。
繁花尽流年 2017-10-19
  • 打赏
  • 举报
回复
数据量少的时候inner join未必有啥优势。一旦上百万区别就明显inner join好些。 顺便LZ你1,2两个逻辑都不是一个东西啊。第二种应该是where exists (...)来写
顺势而为1 2017-10-19
  • 打赏
  • 举报
回复
个人偏向第一种写法, 毕竟第一种是一条语句, 而第二种是两条语句.
e哥 2017-10-19
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
楼主可以根据自己的实际数据,看一下执行计划和效果。
看不懂啊
e哥 2017-10-19
  • 打赏
  • 举报
回复
exists:
二月十六 版主 2017-10-18
  • 打赏
  • 举报
回复
楼主可以根据自己的实际数据,看一下执行计划和效果。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧