2013-08-22 2 views
0

У меня есть исходная таблица #TEMP_TABLE с полем целого индексируется ID, которые мне нужно фильтровать путем присоединения его к другой таблице FILTER на смежной области ID_R, который, в свою очередь фильтруются некоторыми условиями. Эти условия поставляются в петле 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 

ФИЛЬТРА стола довольно огромный, так РЕГИСТРИРУЙТЕСЬ там выполняет двойная задача - она ​​ограничивает ФИЛЬТР в меньшее подмножество по идентификатору, а затем, когда ФИЛЬТР фильтруется его собственным 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, но не мог точно определить правильный запрос, и это похоже на трюк, я попробую. Также есть недорогой способ проверить после DELETE, если #TEMP_TABLE больше нет записей? При использовании оригинального INSERT я мог бы просто проверить @@ ROWCOUNT - и выйти из цикла. –

+0

@YuriyGalanter Если счетчик (*) стоит слишком дорого, вы можете попробовать «выбрать существующий» или, возможно, «выбрать верхнюю 1» в переменную и проверить, является ли она нулевым (сбросьте ее до нуля до выбора) – podiluska

Смежные вопросы