Оставил объединенные 2 таблицы, результат выглядит как внутреннее - PullRequest
0 голосов
/ 03 июля 2018

Вопрос может быть простым, но я совершенно новичок в SQL, так что здесь.

Что я пытаюсь сделать:

У меня есть TableA и TableB. TableA содержит большую часть моих данных, однако он должен изменить один из столбцов (измененный результат), используя данные из TableB, если есть совпадение по ID и диапазону дат.

Вот мой запрос:

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
WHERE 
    t1.createdate BETWEEN '2018-06-19' AND '2018-06-23' 
    AND t2.createdate BETWEEN '2018-06-19' AND '2018-06-23' 
    AND t2.trans_type = 'H'
ORDER BY
    t1.createdate

Есть примерно 2000+ записей в TableA, удовлетворяющих этим критериям для TableA, и только несколько совпадающих записей из TableB. Выполнение этого запроса дает номер строки, равный TableB результату, который для меня выглядит как внутреннее соединение.

Возможно, у меня неправильно в разделе WHERE, но я не могу этого увидеть.

Ответы [ 4 ]

0 голосов
/ 03 июля 2018
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
0 голосов
/ 03 июля 2018

Включение критериев из таблицы LEFT OUTER JOIN в предложение WHERE магическим образом не преобразует его в INNER JOIN; не существует «специального правила», согласно которому вы должны включать все критерии в предложение ON.

Здесь произошло то, что ваш запрос без предложения WHERE вернет некоторые NULL значения из t2, и вы затем исключите их, включив критерии для этого псевдонима, который не включает NULL значений.

Если бы вы переписали свой запрос следующим образом, он бы работал так, как вы хотите:

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
WHERE t1.createdate between '2018-06-19' and '2018-06-23' and (t2.createdate IS NULL OR t2.createdate 
between '2018-06-19' and '2018-06-23') and (t2.trans_type IS NULL OR t2.trans_type = 'H')
ORDER BY t1.createdate
0 голосов
/ 03 июля 2018

Я не уверен насчет технического, но я отвечу вам из моего опыта моей работы

при фильтрации 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

код выше я не тестировал

Надеюсь, это поможет.

0 голосов
/ 03 июля 2018

вот ваше состояние где

    WHERE t1.createdate between '2018-06-19' and '2018-06-23' and t2.createdate 
    between '2018-06-19' and '2018-06-23' ***and t2.trans_type = 'H'***

здесь ваши строки будут отфильтрованы по типу транс ... В основном это ограничение строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...