求优化的sql语句

fibaobao 2010-11-28 09:21:37
现在有两张表:
1.新闻表News:
NewsID Title ...
2.新闻评论表NewsComments
CommentID NewsID PosterID ...
新闻评论表中的NewID是外键,对应新闻表中的NewID。

一个用户可以对一条新闻评论多次。
现在我想找到PosterID为2的用户评论过的新闻,那肯定要用到distinct,怎么写效率最高。

如果不做distinct的话,sql如下,但是选择出来的数据是有重复的。
select News.* from NewsComments left join News on NewsComments.NewsID = NewsComments.NewsID
where NewsComments.PosterID = 2;


还有另外一个问题,NewsComments的数据量是News的n倍(n>50),用NewsComments left join News和News left join NewsComments在性能上哪个更加好。

谢谢大家!时刻关注!
...全文
163 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fibaobao 2010-11-30
  • 打赏
  • 举报
回复
sql server这里的人怎么这么少
abuying 2010-11-29
  • 打赏
  • 举报
回复
exists方法更快些!
当然也可以使用in
select * from news a
where a.NewsID in(select 1
from NewsComments b
and b.PosterID = 2)
sydlovely520 2010-11-29
  • 打赏
  • 举报
回复
新手报道,希望各位多多指教!
tim_spac 2010-11-29
  • 打赏
  • 举报
回复
ms sql server 好像对exists算法有优化,你可以拿实际数据测验一番
oO寒枫Oo 2010-11-29
  • 打赏
  • 举报
回复
NewsComments 比较多时 这个效率应该高一些

select News.* from
(
select NewsID
from NewsComments
where PosterID =2
) NC
left join News on NC.NewsID = News.NewsID
tim_spac 2010-11-29
  • 打赏
  • 举报
回复
貌似
[Quote=引用 2 楼 tim_spac 的回复:]
select * from news a
where exists (select 1
from NewsComments b
where b.NewsID = a.NewsID
and b.PosterID = 2)
[/Quote]不会出现重复数据吧
oO寒枫Oo 2010-11-29
  • 打赏
  • 举报
回复
谢谢14楼 要改一下
 
select News.* from
(
select distinct NewsID
from NewsComments
where PosterID =2
) NC
left join News on NC.NewsID = News.NewsID

fibaobao 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lixinhhxxttxs 的回复:]

引用 11 楼 fibaobao 的回复:

引用 2 楼 tim_spac 的回复:

select * from news a
where exists (select 1
from NewsComments b
where b.NewsID = a.NewsID
and b.PosterID = 2)

引用 6 楼 lxpbs8851 的回复:

NewsComm……
[/Quote]非也 用exist或者in没有重复 用left join但是没加distinct就有重复了
lixinhhxxttxs 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fibaobao 的回复:]

引用 2 楼 tim_spac 的回复:

select * from news a
where exists (select 1
from NewsComments b
where b.NewsID = a.NewsID
and b.PosterID = 2)

引用 6 楼 lxpbs8851 的回复:

NewsComments 比较多时 这个效率应该高一些
SQL ……
[/Quote]

貌似数据都有重复……
oO寒枫Oo 2010-11-29
  • 打赏
  • 举报
回复
1. sql语句的性能 看执行的时间
2. 对数据库的消耗情况可以参考执行计划
fibaobao 2010-11-29
  • 打赏
  • 举报
回复
我用的是sql server management studio
怎么查看sql语句的性能 或者 对数据库的消耗情况
fibaobao 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tim_spac 的回复:]

select * from news a
where exists (select 1
from NewsComments b
where b.NewsID = a.NewsID
and b.PosterID = 2)
[/Quote]
[Quote=引用 6 楼 lxpbs8851 的回复:]

NewsComments 比较多时 这个效率应该高一些
SQL code

select News.* from
(
select NewsID
from NewsComments
where PosterID =2
) NC
left join News on NC.NewsID = News.NewsID
[/Quote]
[Quote=引用 9 楼 abuying 的回复:]

exists方法更快些!
当然也可以使用in
SQL code
select * from news a
where a.NewsID in(select 1
from NewsComments b
and b.PosterID = 2)
[/Quote]
luoyefeng1022 2010-11-29
  • 打赏
  • 举报
回复
赞成6楼的,这方法应该是最优的方法!
fibaobao 2010-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tim_spac 的回复:]

select * from news a
where exists (select 1
from NewsComments b
where b.NewsID = a.NewsID
and b.PosterID = 2)
[/Quote]这个算最佳的sql么?
KeepSayingNo 2010-11-28
  • 打赏
  • 举报
回复
对于你的第一个问题,因为一个用户可以对一个新闻评论多次,当然关联后有重复的啊,用distinct过滤下就好了;
对于你第二个问题,在left join的时候,以数据量小的表去关联数据量大的表,这样速度比较快
tim_spac 2010-11-28
  • 打赏
  • 举报
回复
select * from news a
where exists (select 1
from NewsComments b
where b.NewsID = a.NewsID
and b.PosterID = 2)
strife013 2010-11-28
  • 打赏
  • 举报
回复
顶你下啊啊啊啊

34,576

社区成员

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

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