Вот код. См. Объяснение ниже.
SELECT count_t1, count_t2,
IFNULL(count_t1, 0) - IFNULL(count_t2, 0) AS diff,
t1.testid, t1.tpid
FROM (
SELECT COUNT(*) AS count_t1,
testid,
tpid
FROM cicdexpecteddocument e
WHERE e.testid = 8
GROUP BY e.tpid
) AS t1
LEFT OUTER JOIN
(
SELECT COUNT(*) AS count_t2,
testid,
tpid
FROM cicdactualdocument a
WHERE a.testid = 8 AND a.executionid =
'execution-d0c5e270-50f2-472e-a609-ac2c381e0a5f-2020.01.09'
GROUP BY tpid
) AS t2 ON t1.testid = t2.testid AND t1.tpid = t2.tpid
ORDER BY tpid
Рассекать это:
Пропустить столбцы SELECT
и заметить, как два запроса, которые вы указали для каждой таблицы, содержатся в круглых скобках с последующим " AS t1 "(или t2) - это подзапросы. После того, как 2-ой подзапрос (от 2-ой до последней строки), где я указал условие соединения.
Далее, как вычисляется столбец "diff". Он использует функцию IFNULL()
, которая возвращает значение, указанное во втором параметре, если первичное значение равно NULL. Это позволяет базе данных выполнять вычисления даже на NULL-значениях.
Примечание: Я просто быстро и грязно все собрал, но здесь я не делаю никаких предположений о скорости. Если у вас есть пара сотен строк, ничего страшного. Но если вы имеете дело с тысячами строк в каждой таблице, вам может потребоваться оптимизировать этот запрос.
Надеюсь, это поможет!