2013-06-26 3 views
0

У меня есть сценарий, содержащий курсор с инструкцией if-else, но для просмотра таблицы требуется слишком много времени. (таблица с 79000 строк занимает 1 час). Поэтому мне нужно преобразовать его в подход, основанный на наборе.преобразовать инструкцию if-else внутри курсора в наборе подход

если заявление является

IF ( 
     SELECT count (b.key) 
      FROM general..ean a, 
       general..mainframe b, 
       general..hope c 
     WHERE a.ean = @ean 
     AND a.c_suppression = '0' 
     AND a.key = b.key   
     AND b.key = c.key 
     AND c.canal = @canal 
    ) = 0 

, где @ean и @canal являются значение, извлеченное в каждой строке с курсором. Просмотренная таблица - tmp_day_house_info_corporate. Так что мне нужно получить все строки из tmp_day_house_info_corporate, для которых @info и @canal в выражении if извлекают 0.

Благодарим вас за помощь.

+3

Можете ли вы опубликовать весь код, включая декларацию курсора и выборку? –

+0

Я подозреваю, что вы можете переписать итерацию курсора в качестве соединения, но, не видя больше кода, трудно сделать больше, чем микро оптимизировать. –

ответ

3
SELECT * 
     FROM tmp_day_house_info_corporate 
    WHERE not exists(
     SELECT b.key 
      FROM general..ean a, 
       general..mainframe b, 
       general..hope c 
     WHERE a.ean = tmp_day_house_info_corporate.ean 
     AND a.c_suppression = '0' 
     AND a.key = b.key   
     AND b.key = c.key 
     AND c.canal = tmp_day_house_info_corporate.canal 
    ) 
+0

Это работает по-прежнему. спасибо – Mentezza

3

Count является крайне неэффективным при проверке, если запись существует, то было бы гораздо лучше с not exists

IF NOT EXISTS ( 
     SELECT * 
      FROM general..ean a, 
       general..mainframe b, 
       general..hope c 
     WHERE a.ean = @ean 
     AND a.c_suppression = '0' 
     AND a.key = b.key   
     AND b.key = c.key 
     AND c.canal = @canal 
    ) 

Если это до замедляться показать свой полный запрос и, возможно, это будет возможно сделать это установить на основе ,

+2

Небольшое примечание: 'TOP 1' не требуется с' NOT EXISTS'. Scan (или Seek) останавливается в первой строке, соответствующей критериям, и возвращает false. –

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

  • Нет связанных вопросов^_^