Внутреннее объединение, если таблицы пусты с 1000 лучшими результатами

#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