日期:2014-05-18  浏览次数:20428 次

麻烦帮我看看这个语句

语句1:
SELECT TOP 6 *,(SELECT C.ClassName FROM [shop_Class] C WHERE C.ClassID=shop_Product.ClassID) as ClassName FROM [shop_Product] WHERE isPassed=1 AND isSale=1 AND ((DATEDIFF(dd,BeginTime,'2012-8-8 11:17:26')>=0 AND DATEDIFF(dd,EndTime,'2012-8-8 11:17:26')<0) OR ValidDay=0)

语句2:
select top 6 a.*,b.ClassName from shop_Class b,shop_Product a where a.ClassId=b.ClassId and isPassed=1 AND isSale=1 AND ((DATEDIFF(dd,BeginTime,'2012-8-8 11:17:26')>=0 AND DATEDIFF(dd,EndTime,'2012-8-8 11:17:26')<0) OR ValidDay=0)

我一般采用语句2的方式,我看好多使用了语句1的方式,请问下语句1的方式是不是效率高些?

如果采用语句一,在不改变结构的情况下。如何只显示 shop_Class.enabled=1的记录?

------解决方案--------------------
选中语句,查看执行计划,有索引的条件下建议用方法2效率高


(DATEDIFF(dd,BeginTime,'2012-8-8 11:17:26')>=0这条件要改为不用函数
楼主这条件是否有误

条件去掉时分秒后应该直接用between 就行了吧
------解决方案--------------------
如下
SQL code
((DATEDIFF(dd,BeginTime,'2012-8-8 11:17:26')>=0 AND DATEDIFF(dd,EndTime,'2012-8-8 11:17:26')<0) OR ValidDay=0)
改为
(BeginTime<='2012-8-8' AND EndTime>='2012-8-8'  OR ValidDay=0)

------解决方案--------------------
如何只显示 shop_Class.enabled=1的记录?

where后面再加上

and exists(select 1 from [shop_Class] d where d.ClassId=shop_Product.ClassID and d.enabled=1)
------解决方案--------------------
请问下语句1的方式是不是效率高些?

除非ClassID上有索引,并且top(n) 的n很小,否则这种写法的效率很差。
------解决方案--------------------
一的语句难看死了。还是用二 INNER JOIN这种写法更好看些