Вы можете получить несовпадающие значения, используя cross join
для генерации строк, а затем left join
или аналогичный механизм для фильтрации существующих значений. Полная таблица будет выглядеть так:
select m.mat_id, p.prod_id, m.qty
from (select distinct mat_id, qty
from t
where prod_id = 20
) m cross join
(select distinct prod_id
from t
) p ;
Это, вероятно, самый простой способ создать нужную таблицу. Но если вы хотите вставить пропущенные строки (ваш фактический вопрос):
select m.mat_id, p.prod_id, m.qty
from (select distinct mat_id, qty
from t
where prod_id = 20
) m cross join
(select distinct prod_id
from t
) p left join
t
on t.mat_id = m.mat_id and t.prod_id = p.prod_id
where t.mat_id is null;