优化SQL Server查询

时间:2013-03-18 19:12:13

标签: sql-server sql-server-2000

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查询。

这个查询的作用是内部按项目名称加入三个表格(目前它只是'%%'。稍后将会出现'%apple%'之类的内容)。而且,因为这是用于分页,它也有NOT IN语法。

这里的问题是有两个重复的INNER JOIN&短语 - 一个在NOT IN内部,另一个在外部。如何删除这些重复的代码并使其更快:(?

(它基于SQL Server 2000)

1 个答案:

答案 0 :(得分:1)

让我回答一个不同的问题(根据评论):如何在SQL Server上进行分页?您通常使用row-Number函数:

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

然后,你所有的问题都消失了。