2013-08-21 3 views
0

У меня возникают проблемы, когда у меня есть несколько объединений и когда переменные, переданные им, равны нулю. Мне интересно, как игнорировать соединение, когда значение пусто. Я думал, что могу сделать это так, но это не приносит мне правильных результатов, когда любой из параметров имеет значение, а остальное - нет.Как проигнорировать объединение, когда переменная равна нулю

@param1 int = NULL 
,@param2 int = NULL 
,@param3 int = NULL 

SELECT t.ID,t.Col1 FROM Table t 
JOIN RelationalTable1 t1 ON (@param1 IS NULL) OR (t1.ID1 = t.ID AND t1.ID2 = @param1) 
JOIN RelationalTable2 t2 ON (@param2 IS NULL) OR (t2.ID1 = t.ID AND t2.ID2 = @param2) 
JOIN RelationalTable3 t3 ON (@param3 IS NULL) OR (t3.ID1 = t.ID AND t3.ID2 = @param3) 

Как я могу заставить эти объединения исчезать, когда их параметры равны нулю?

+1

Как результаты не действуют? Просьба привести пример. Вы можете создать его по адресу http://sqlfiddle.com –

+0

Он возвращает 0 результатов, когда все параметры являются emtpy или не возвращают данные, смешанные, когда есть 1 + params, не равные нулю. –

+0

Вы должны написать dymanic sql, чтобы справиться с этим. Вы не можете просто игнорировать соединение. Если бы у вас когда-либо было только 2 или 3 параметра, вы могли бы писать отдельные варианты, используя конструкцию If, но более 3 из них выходят из-под контроля vey быстро, и даже три имеют ужасное количество случаев для обработки вручную. – HLGEM

ответ

1

Похоже, вы используете соединения в качестве фильтров, и хотите сохранить все, когда параметры NULL.

Моя рекомендация, чтобы переключиться на left outer join:

SELECT t.ID, t.Col1 
FROM Table t LEFT JOIN 
    RelationalTable1 t1 
    ON (@param1 IS NULL) OR (t1.ID1 = t.ID AND t1.ID2 = @param1) LEFT JOIN 
    RelationalTable2 t2 
    ON (@param2 IS NULL) OR (t2.ID1 = t.ID AND t2.ID2 = @param2) LEFT JOIN 
    RelationalTable3 t3 
    ON (@param3 IS NULL) OR (t3.ID1 = t.ID AND t3.ID2 = @param3) 
WHERE ((@param1 IS NULL) or (t1.ID is not null)) and 
     ((@param2 IS NULL) or (t2.ID is not null)) and 
     ((@param3 IS NULL) or (t3.ID is not null)); 

Предложение where говорит «где параметр является нулевым или есть совпадение в соответствующей таблице».

Я не уверен, нужен ли параметр IS NULL в предложении on. Он будет генерировать дополнительные несколько строк для каждой строки в дополнительных таблицах.