2015-08-07 3 views
1

В моем текущем проекте есть запрос, где задан набор параметров, и мне нужно проверить эти параметры на другую таблицу. Каждый из этих параметров может быть NULL и в этом случае должен быть проигнорирован. То, что я в настоящее время сделать следующее:Таблица параметров и условия

SELECT t.col1, 
     t.col2, 
     t.col3, 
     t.col4, 
     t.col5, 
     t.col6, 
     t.col7, 
     t.col8 
FROM table1 t 
INNER JOIN #parameters p ON  (p.col1 IS NULL OR p.col1 = t.col1) 
          AND (p.col2 IS NULL OR p.col2 = t.col2) 
          AND (p.col3 IS NULL OR p.col3 = t.col3) 
          AND (p.col4 IS NULL OR p.col4 = t.col4) 
          AND (p.col5 IS NULL OR p.col5 = t.col5) 
          AND (p.col6 IS NULL OR p.col6 = t.col6) 
          AND (p.col7 IS NULL OR b.col7 >= t.col7) 
          AND (p.col8 IS NULL OR b.col8 <= t.col8) 

Это означает, что если столбец в таблице параметров NULL он будет игнорироваться в противном случае он будет по сравнению с соответствующим столбцом в table1. Это работает, но, к сожалению, ОЧЕНЬ медленно. Кто-нибудь знает лучшее решение (другое, а затем конкатенирование строкового запроса)?

+1

Почему это медленно: что говорит план запроса о том, что занимает время? – Richard

+1

let try: select * from table1 t join #parameter on (p.col1 = t.col1) union select * from table1 t join #parameter on (p.col1 is null) –

+0

Имеет ли '# parameters' одну строку или может ли он содержать несколько строк? – Tanner

ответ

0

Похоже, что у вас нет реальных критериев, которые можно было бы использовать для ограничения данных в вашей таблице, и такая структура обычно никогда не работает хорошо. Насколько я знаю, вы не можете сделать, чтобы попытаться улучшить это.

Является ли какой-либо из этих столбцов таким, что он часто включается в параметры (для всех строк) и может ограничить данные? Вы можете использовать объединение, чтобы сделать что-то вроде этого:

SELECT ... 
    FROM table1 t 
    INNER JOIN #parameters p ON p.col1 = t.col1 ... 

    union 

    SELECT ... 
    FROM table1 t 
    INNER JOIN #parameters p ... where p.col1 is NULL 

Если вам повезет, что-то подобное может сработать.

Другой вариант, который приходит мне на ум, как-то перебирает строки в таблице #parameters, что, вероятно, означает то, что вы подразумеваете под конкатенацией строк. Либо создавая динамический SQL с предложениями or, либо union, либо у вас есть temp. таблицу, возможно, с ignore dup key index и создайте & запустите динамические вставки предложения один за другим для всех строк в параметрах-таблице.

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