Вам нужно больше узнать о объединениях .Есть 3 основных соединения, которые могут сделать жизнь намного проще.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ: Во-первых, это не запрашивается, но запрос, который вы указали для нахождения внебалансовых позиций, слишком сложен.Это может быть упрощено внутренним соединением.Внутреннее соединение - это операция набора, которая в основном будет получать данные из обеих таблиц (набор), которые соответствуют условию.
select * from
(
(select id, sum(amount) from a group by id) group_A
INNER JOIN (select id, sum(amount) from b group by id) group_B
ON group_A.id = group_B.id
WHERE group_A.balance != group_B.balance
)
ВЛЕВО / ВПРАВО ВНЕШНЕЕ СОЕДИНЕНИЕ: Левое внешнее соединение - это операция, котораявернет все данные, которые присутствуют в обоих наборах, а также данные, которые находятся в левом наборе, но не в правом наборе.Правое соединение - это та же самая операция, что и для правильного набораВажно отметить, что дополнительные записи, извлеченные здесь, будут нулевыми для той стороны, где они не существуют.
Поскольку вам нужны записи, которые присутствуют в таблице B, но отсутствуют в A, существует несколько способов достижения этого,Можно было бы получить записи, присутствующие в обеих таблицах (внутреннее соединение), а затем получить все записи в таблице B, но не во внутреннем соединении, выполненном ранее.Используя определение group_A / group_B из примера внутреннего соединения.
select id from b where id not in (
select id from group_A INNER JOIN group_B on group_A.id = group_B.id)
Или вы можете выполнить правильное внешнее соединение, а затем использовать свойство этих полей, извлеченных из таблицы A, как нулевое, можно отфильтроватьтребуемый идентификатор.
select group_B.id from group_A RIGHT OUTER JOIN group_B ON group_A.id = group_B.id
where group_A.id is null
Пожалуйста, используйте первичные ключи на соединениях, чтобы получить правильные результаты, указанные пользователем @ ComputerVersteher