Я не уверен насчет технического, но я отвечу вам из моего опыта моей работы
при фильтрации t2 в предложении WHERE
. СУБД фильтрует весь результат после JOIN
если вы хотите сохранить все строки t1, используя subQuery вместо t2, или переместить фильтр t2, чтобы присоединиться к примеру условия
использовать подзапрос вместо T2
SELECT t1.ID, t1.a, t1.b, t1.c, t1.d, t1.e, t1.f, t1.g, t1.h, t1.i,
(t1.totalcost - (ISNULL(t2.cost, 0) * ISNULL(t2.qty,0))) as modified_result,
t1.j, t1.k, t1.createdate
FROM TableA as t1
LEFT JOIN (
SELECT *
FROM TableB t2
WHERE t2.createdate between '2018-06-19' and '2018-06-23' and t2.trans_type = 'H'
) AS t2 ON t1.ID = t2.ID
WHERE t1.createdate between '2018-06-19' and '2018-06-23'
ORDER BY t1.createdate
или
переместить фильтр t2, чтобы присоединиться к условию
SELECT t1.ID, t1.a, t1.b, t1.c, t1.d, t1.e, t1.f, t1.g, t1.h, t1.i,
(t1.totalcost - (ISNULL(t2.cost, 0) * ISNULL(t2.qty,0))) as modified_result,
t1.j, t1.k, t1.createdate
FROM TableA as t1
LEFT JOIN TableB AS t2 ON t1.ID = t2.ID and t2.createdate between '2018-06-19' and '2018-06-23' and t2.trans_type = 'H'
WHERE t1.createdate between '2018-06-19' and '2018-06-23'
ORDER BY t1.createdate
код выше я не тестировал
Надеюсь, это поможет.