2014-12-29 11 views
0

У меня есть запрос, как этотХотите результаты в том же порядке, что и вход

SELECT NUM, 
     col1, 
     col2, 
     col3, 
     col4, 
     col5, 
     col6 
FROM (SELECT NUM, 
       col1, 
       col2 
     FROM (SELECT a.mid AS NUM, 
         a.col1 AS col1, 
         a.col2 AS col2 
       FROM tbl a (nolock) 
       WHERE a.mid IN ('09-404811,10-433495,10-433575,10-423789')) AS MainQuery 
       UNPIVOT (LabelValue 
         FOR Label IN (NUM, 
            col1, 
            col2)) AS UnpvtQuery) LT 
     INNER JOIN #SetItemsTable tt 
       ON tt.col7 = LT.col1 
WHERE LT.NUM IN ('09-404811,10-433495,10-433575,10-423789') 
ORDER BY Charindex(NUM, '09-404811,10-433495,10-433575,10-423789') 

это лишь представление исходного запроса. Список значений, предоставленных для IN(), будет приблизительно 400+.

Проблема, которая у меня есть с этим вопросом: ORDER BY CHARINDEX(NUM,'09-404811,10-433495,10-433575,10-423789') занимает почти 25 секунд для выполнения. В противном случае остальная часть запроса занимает всего 6 секунд. Я использую CHARINDEX(), потому что мне нужен результат в том же порядке, в котором отображаются значения внутри IN().

Как я могу эффективно выполнять эту работу.

+1

Самый простой способ сделать это - использовать эффективную функцию разделения. Будет ли это значительно быстрее, чем ваш текущий подход еще предстоит выяснить ... –

+0

'LT.NUM IN ('09 -404811,10-433495,10-433575,10-423789 ')' не будет делать то, что вы хотите так или иначе. Это опечатка? Должно быть «LT.NUM IN ('09 -404811», «10-433495», «10-433575», «10-423789») '. –

+0

@ Мартин, вы правы. Это опечатка. На самом деле я использую функцию разделения, которая принимает только один список, разделенный запятыми, вместо отдельных строк. – BumbleBee

ответ

1

Сначала я бы выбрал внутренний запрос во временную таблицу, тогда вы можете запросить и упорядочить/сгруппировать, как вам нужно. Я бы не пытался использовать Charindex, потому что ему нужно будет пройти все возвращаемые значения.

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