2013-08-22 53 views
0

我有一個原始表#TEMP_TABLE與的整數索引字段ID我需要通過在相關領域ID_R其又通過一些條件過濾它接合到另一個表FILTER進行過濾。這些條件在WHILE循環中提供。在循環結束時,我需要將原始的#TEMP_TABLE中的過濾結果反饋回去。插入結果爲原始表

所以目前我在做類似的東西

WHILE [loop condition] 
BEGIN 
    SELECT #TEMP_TABLE.ID INTO #TMP_FILTERED_TABLE 
    FROM #TEMP_TABLE INNER JOIN FILTER ON #TEMP_TABLE.ID = FILTER.ID_R 
    WHERE FILTER.FIELD1 = [parameter1 from loop] AND FILTER.FIELD2 = [parameter2 from loop] 

    TRUNCATE TABLE #TEMP_TABLE 

    INSERT INTO #TEMP_TABLE (ID) 
    SELECT ID FROM #TMP_FILTERED_TABLE 

    DROP TABLE #TMP_FILTERED_TABLE 
END -- END LOOP 

過濾表是相當龐大所以加入有執行雙重任務 - 它通過ID限制過濾器,以一個較小的子集,然後在過濾器通過自身的過濾WHERE子句限制輸出結果。隨着循環過程結果變得越來越小,因爲#TEMP_TABLE變小了。

要求是循環在最初的#TEMP_TABLE中有最終結果之後。

有沒有更好,更優化,最優化的方法來做到這一點?

+1

Oook ...請問downvoters請評論理由downvotes?是「你試過了什麼?」或「不是一個編程問題」或「因爲」而置之不理。請註明, –

回答

0

而不是使用Filtered_table的,你能不能只用

delete t 
from #temp_table t 
     INNER JOIN FILTER ON t.ID = FILTER.ID_R 
     WHERE NOT (FILTER.FIELD1 = [parameter1 from loop] 
       AND FILTER.FIELD2 = [parameter2 from loop]) 
+0

謝謝!我正在考慮DELETE,但無法確定正確的查詢,而且這個看起來像會做詭計,我會試一試。如果#TEMP_TABLE沒有更多記錄,是否還有一種廉價的方法來檢查DELETE之後?當使用原始INSERT時,我可以檢查@@ ROWCOUNT - 並退出循環。 –

+0

@YuriyGalanter如果一個count(*)太貴,你可以嘗試一個'select exists'或者'select top 1'到一個變量中並且檢查它是否爲null(在select之前將它重置爲null) – podiluska