2013-03-18 124 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