有没有数据库高手分析一下这两天查询语句

爛轲 2016-07-28 06:15:52
结果一样,但是我想知道那个更好,为什么?我是新手,其中有条是我写的,大家能看出来么

第一条:
select e.*,(select top 1 r.ProductName from tb_barcodeout q
left join tb_productbatchNo w on q.batchid=w.id
left join tb_product r on w.product=r.id
where q.fwcode=e.jfcode and e.jfcode!='') as ProductName from Tbj_IntegralChange e
left join Tbj_Member a on e.MemberId=a.Id
ORDER BY ChangeId DESC


第二条:
select q.*,e.ProductName from Tbj_IntegralChange q
inner join Tbj_Member w on q.MemberId=w.Id
left join Tb_Product e on e.id in
(select Product from Tb_ProductBatchNo where id in
(select BatchId from Tb_BarCodeOut where FWCode = q.JFCode and q.jfcode!=''))
ORDER BY q.ChangeId DESC

...全文
141 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
爛轲 2016-07-30
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
语句1,索引不合理或没有索引的情况下,会出现 语句2,在条件列和显示列上建上个索引,这种情况下可能语句2效率高 另外你的语句逻辑上是否正确?红色条件这是常量值显示,你可单独一个表连接处理 q.fwcode=e.jfcode and e.jfcode!=''
我的逻辑正确啊,就是要要求 e.jfcode不能等于空,因为q.fwcode 的这张表有点小问题,当e.jfcode为空时,q.fwcode为也空,然后查询的这条数据应该是不存在的,但是他有q.fwcode为空的数据,这就很尴尬了,所以就这样写。 你说的单独一个表连接处理是什么意思呢,没搞懂。
中国风 2016-07-30
  • 打赏
  • 举报
回复
AND e.jfcode != '' 可尝试单独条件判断 你用outer这样测测性能
SELECT  e.* ,
        b.ProductName
FROM    Tbj_IntegralChange e
        LEFT JOIN Tbj_Member a ON e.MemberId = a.Id
		OUTER APPLY( SELECT TOP 1
                    r.ProductName
          FROM      tb_barcodeout q
                    LEFT JOIN tb_productbatchNo w ON q.batchid = w.id
                    LEFT JOIN tb_product r ON w.product = r.id
          WHERE     q.fwcode = e.jfcode
                    AND e.jfcode != ''
        ) AS b
ORDER BY ChangeId DESC;
中国风 2016-07-29
  • 打赏
  • 举报
回复
语句1,索引不合理或没有索引的情况下,会出现 语句2,在条件列和显示列上建上个索引,这种情况下可能语句2效率高 另外你的语句逻辑上是否正确?红色条件这是常量值显示,你可单独一个表连接处理 q.fwcode=e.jfcode and e.jfcode!=''
爛轲 2016-07-29
  • 打赏
  • 举报
回复
第一条:

第二条:

好的,谢谢大家

引用 5 楼 saiwen8888 的回复:
同新手 猜第二条你写的吧。。

猜得不错
saiwen8888 2016-07-29
  • 打赏
  • 举报
回复
同新手 猜第二条你写的吧。。
中国风 2016-07-29
  • 打赏
  • 举报
回复
有索引的情况,估计第2种方法更有效到索引 选中两个语句--CTRL+L 执行计划占用百分比少的效率高 最好用OUTER APPLE连接
卖水果的net 2016-07-28
  • 打赏
  • 举报
回复
这两条语句并不等价,只是你现有的数据,查出来的结果是一样的,如果数据量大了,结果就有可能会不一样了。
kingtiy 2016-07-28
  • 打赏
  • 举报
回复
ctrl+L 查看执行划看看. 看下哪个更好.
快溜 2016-07-28
  • 打赏
  • 举报
回复
看一下执行计划,分析的比较详细

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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