2012-03-14 59 views
1

現在我正在使用一個asp頁面來循環查看一個大表,看看其中一行是否至少有一個項目在它是'1D%',但是它需要大量的時間,它不僅需要'1D',還需要至少30個其他兩個角色。是否有一個SQL查詢,可以使這個到一個表sql選擇不同的行,其中項目是這樣的

感謝

OK的傢伙給你更多的什麼,我試圖做一個想法,我想這個查詢去得更快

sql2 = "SELECT code FROM products " 
set bs = MyConn.Execute(sql2) 
    do until bs.eof 
     if not bs.eof then 
      sql3 = "SELECT code FROM brand" 
      set ns = MyConn.Execute(sql3) 
       do until ns.eof 
        if not ns.eof then 
         sql = "SELECT TOP 1 sku, MID(sku, 1, 5) AS brand FROM catalog WHERE sku LIKE '"&bs.fields("code")&ns.fields("code")&"%' " 
         set rs = MyConn.Execute(sql) 
         do until rs.eof 
          if not rs.eof then 
           response.write(rs.fields("brand")&"<br>") 
          end if 
         rs.movenext 
         loop 
         set rs = Nothing 
        end if 
       ns.movenext 
       loop 
      set ns = nothing 
     end if 
    bs.movenext 
    loop 
set bs = Nothing 

輸出是這樣的 1DZOO 1FBAH 1FDRE 1FGRA 1FRIV 1FSCS 1FSEC 1FSUR 1CALI

+0

大概是什麼樣的 – Brian 2012-03-14 16:32:28

+0

表結構,請編輯您的問題並提供一些示例數據(包括列類型和名稱)以及您試圖獲得的輸入和輸出。我現在可以回答這個問題,並說「是」,但無法告訴你如何去做,因爲你沒有提供這樣做的信息。 – 2012-03-14 16:33:32

+0

WHERE MID(field,1,2)LIKE'1D'可能有助於提高速度 - 即採取固定數量的字符並放棄通配符。 – JTeagle 2012-03-14 16:35:30

回答

0

要考慮的另一件事是將索引計算列添加到目錄表,這樣可以更容易地(和索引)查詢& - 加入。因爲SUBSTRING在本質上是確定的(計算列只能如果它們是確定性的索引),這些欄目將一樣快,一次索引(合理的),例如:

CREATE TABLE [dbo].[tbl_Example](
    [ID] [int] NULL, 
    [SKU] [varchar](50) NULL, 
    [Computed_Product] AS (substring([SKU],(1),(2))), 
    [Computed_Brand] AS (substring([SKU],(3),(2))) 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
CREATE NONCLUSTERED INDEX [IX_Computed_BrandCode] ON [dbo].[tbl_Example] 
(
    [Computed_Brand] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
CREATE NONCLUSTERED INDEX [IX_ComputedProductCode] ON [dbo].[tbl_Example] 
(
    [Computed_Product] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
INSERT [dbo].[tbl_Example] ([ID], [SKU]) VALUES (1, N'ASdasdasdL') 
INSERT [dbo].[tbl_Example] ([ID], [SKU]) VALUES (2, N'1231f2efwdsfas') 
INSERT [dbo].[tbl_Example] ([ID], [SKU]) VALUES (3, N'sdf23re2fwdf') 
+0

謝謝你的天堂 – kqlambert 2012-03-14 23:39:20

1

你可以嘗試像

SELECT ... WHERE SUBSTRING(yourfield, 0, 2) IN ('1D', '2D', '3D', ...) 
+0

SQL2 = 」SELECT代碼產品「 \t集BS = MyConn.Execute(SQL2) \t \t做,直到bs.eof \t \t \t如果不是bs.eof然後 \t \t \t \t SQL3 = 「SELECT code FROM brand」 \t \t \t \t set ns = MyConn.Execute(sql3) \t \t \t \t \t做,直到ns.eof \t \t \t \t \t \t如果不是納秒。EOF然後 \t \t \t \t \t \t \t SQL = 「SELECT TOP 1 SKU,MID(SKU,1,5)AS品牌FROM目錄WHERE SKU LIKE「 」&bs.fields(「 代碼 」)&ns.fields(「 代碼」 ) 「%」」 \t \t \t \t \t \t \t集合RS = MyConn.Execute(SQL) \t \t \t \t \t \t \t做,直到RS.EOF \t \t \t \t \t \t \t \t如果不是RS.EOF然後 \t \t \t \t \t \t \t \t \t回覆於(rs.fields( 「品牌」)& 「
」) \t \t \t \t \t \t \t \t端如果如何我可以做得更快嗎? – kqlambert 2012-03-14 18:35:13

+0

是的,這不允許使用索引。你的其他選擇是反規範化並創建一個派生字段來存放這兩個字符,這將允許索引(觸發器保持同步),或者一個很長的醜陋'你的字段'1d%'或你的字段'2d% '或你的領域像'3d%'等等......' – 2012-03-14 18:37:04

+0

它會一樣快地做長醜的地方嗎?我可以做一個循環爲你的領域建立一個字符串,然後把它放到sql查詢 – kqlambert 2012-03-14 18:50:12

0

你的意思是你是第一個裝載在記錄的所有數據,然後循環它在ASP來篩選呢?難怪它很慢! SQL會像

SELECT 
    Col1, Col2 
FROM 
    Table1 
WHERE 
    SearchCol1 LIKE '1D%' 
    OR 
    SearchCol2 LIKE '1D%' 

這也不會很快,但會比現在快得多。

+0

1D代表品牌的類型,目錄表是不斷更新與什麼項目出售。所以我需要一些方法來顯示,如果我們有任何來自該品牌的商品在庫存中,然後顯示它們,我檢查的目錄字段被稱爲sku,並且sku字段的前兩個字符聲明它是什麼品牌 – kqlambert 2012-03-14 17:38:12

+0

因此,要麼由Marc發佈的類似或子字符串應該爲你工作。 – 2012-03-14 17:41:32

相關問題