#tsql #table-valued-parameters
Вопрос:
У меня есть три параметра с табличным значением, переданные в SP. Все они содержат данные для фильтрации запроса. Я хочу объединить их в таблицу, как показано ниже, но только в том случае, если в параметре с табличным значением есть данные
SELECT DISTINCT TOP (1000)
Person.col1,
Person.col2,
FROM dbo.Person INNER JOIN
@tbl1 t1 ON Person.col3 = t1.val INNER JOIN
@tbl2 t2 ON Person.col4 = t2.val INNER JOIN
@tbl3 t3 ON Person.col5 = t3.val
Я знаю, что могу выполнить Левое внешнее соединение, но мне не нужны результаты с нулевыми значениями. Топ-1000 необходим, так как данных много, а сканирование всей таблицы вызывает проблемы с производительностью
Комментарии:
1. Вы можете использовать левое соединение и выбрать столбец, который не является нулевым.
2. @AlirezaAhmadi Проверьте, не является ли значение not null в операторе Where в конце запроса не работает, если у вас несколько tvfs. Если tbl1 имеет значения, но tbl2 пуст, и вы выбрали значение не равно нулю, в обеих таблицах строки не возвращаются. Я все равно хотел бы, чтобы результат tbl1 был возвращен
Ответ №1:
Попробуйте использовать coalesce для проверки нулей
SELECT DISTINCT TOP (1000)
Person.col1,
Person.col2,
FROM dbo.Person INNER JOIN
@tbl1 t1 ON coalesce(Person.col3, '111') = t1.val INNER JOIN
@tbl2 t2 ON coalesce(Person.col4 , '111')= t2.val INNER JOIN
@tbl3 t3 ON coalesce(Person.col5, '111') = t3.val