Я не могу обещать, что это эффективно, но вы могли бы определить все возможные значения для каждого поля, перекрестно соединить их, а затем идентифицировать (и вставить) пропущенные значения:
insert into foo
with all_records as (
select distinct record_id from foo
),
all_strings as (
select distinct rec_string from foo
),
all_combo as (
select record_id, rec_string
from all_records, all_strings
)
select *
from all_combo a
where not exists (
select null
from foo f
where
a.record_id = f.record_id and
a.rec_string = f.rec_string
)
Если этот подход дает значения, которые вам не нужны, вы всегда можете просто добавить предложение "where", чтобы ограничить несоответствующие значения.