2013-03-18 214 views
1
SELECT TOP 10 dic.item_cd, 
       dic.item_knm, 
       dic.item_enm 
FROM tbus.dt_item_com dic 
INNER JOIN tbus.mfProd mfp ON dic.item_cd LIKE mfp.prodId 
INNER JOIN tbus.plu_category plc ON mfp.prodType LIKE plc.plc_prodType 
WHERE (dic.item_knm LIKE '%%' 
    OR (dic.item_enm LIKE '%%') 
    AND (dic.item_cd NOT IN 
     (SELECT TOP 0 dic.item_cd 
      FROM tbus.dt_item_com dic 
      INNER JOIN tbus.mfProd mfp ON dic.item_cd LIKE mfp.prodId 
      INNER JOIN tbus.plu_category plc ON mfp.prodType LIKE plc.plc_prodType 
      WHERE (dic.item_knm LIKE '%%' 
       OR dic.item_enm LIKE '%%') 
      ORDER BY dic.item_cd DESC)) 
ORDER BY dic.item_cd DESC 

这是SQL查询我想优化。优化SQL Server查询

什么这个查询的作用是内部连接的项目名称三个表(目前它只是“%%”。这会是像“苹果%%”后面')。而且,因为这是用于分页的,所以它也没有IN语法。

这里的问题是有两个重复的INNER JOIN & WHERE短语 - 一个在NOT IN内部,另一个在外部。我怎样才能消除这种重复的代码,并使其更快:(

(它是基于SQL Server 2000上)

+0

你有什么指标 – tomsv 2013-03-18 19:15:16

+0

但这顶0的意思与NOT IN回事呢。???它有特殊的含义吗?你是否试图通过排除做分页? – usr 2013-03-18 19:20:23

+0

dontamaso //遗憾的是,没有数量指标。 Odering item_cd(项目代码)将是方式对其进行索引。 – Raccoon 2013-03-18 19:30:32

回答

1

我来回答不同的问题(按照注释):如何做分页SQL Server上?您通常使用的行号功能:

select * from (
select *, row_number() over(order by something) r 
from T 
) x 
where r >= 10 and r < 20 

然后,你所有的问题消失

+0

我知道这个解决方案的......但问题依然存在。它不是2008版本(不幸的是,Row_number()不受支持 – Raccoon 2013-03-18 20:14:40

+0

废话,我忽略了SQL 2000标记。不能相信这个产品仍然被使用?!无论如何,我没有资格回答这个问题,你可能会马上删除它,也许你应该只是谷歌的“SQL Server 2000”分页,各种各样的东西出现了吧, – usr 2013-03-18 20:25:17

+0

不用删了,有人会觉得它有用:) – Raccoon 2013-03-18 20:38:04