with unique_keys as (select
o.conname,
(select nspname from pg_namespace where oid=c.relnamespace) as target_schema,
c.relname as target_table,
c.oid as target_table_oid,
o.conkey AS target_col
from pg_constraint o inner join pg_class c on c.oid = o.conrelid
where o.contype ='u'),
unique_keys_unnest as (select target_schema, target_table, target_table_oid, target_col, target_col_num, ordin
from unique_keys, unnest(unique_keys. Target_col) with ordinality as f(target_col_num, ordin)),
unique_keys_with_names as (select target_schema, target_table, array_agg(a_target.attname order by a_target.attname) as key_columns
from unique_keys_unnest k inner join pg_attribute a_target on k.target_col_num = a_target.attnum and k.target_table_oid = a_target.attrelid and a_target.attisdropped = false
group by target_schema, target_table),
unique_keys_with_names_agg as (select target_schema, target_table, key_columns
from unique_keys_with_names),
fk as (select
o.conname,
(select nspname from pg_namespace where oid=f.relnamespace) as foreign_schema,
f.relname as foreign_table,
f.oid as foreign_table_oid,
o.confkey AS foreign_col,
(select nspname from pg_namespace where oid=c.relnamespace) as target_schema,
c.relname as target_table,
c.oid as target_table_oid,
o.conkey AS target_col
from pg_constraint o inner join pg_class c on c.oid = o.conrelid
inner join pg_class f on f.oid = o.confrelid
where o.contype = 'f' ),
fk_unnest as (select conname, foreign_schema, foreign_table, foreign_table_oid, foreign_col, foreign_col_num, target_schema, target_table, target_table_oid, target_col, target_col_num, ordin
from fk, unnest(fk.foreign_col, fk. Target_col) with ordinality as f(foreign_col_num, target_col_num, ordin)),
fk_with_names as (select conname, foreign_schema, foreign_table, array_agg(a_foreign.attname order by ordin) as foreign_col, target_schema, target_table, array_agg(a_target.attname order by ordin) as target_col
from fk_unnest fk inner join pg_attribute a_foreign on fk.foreign_col_num = a_foreign.attnum and fk.foreign_table_oid = a_foreign.attrelid and a_foreign.attisdropped = false
inner join pg_attribute a_target on fk.target_col_num = a_target.attnum and fk.target_table_oid = a_target.attrelid and a_target.attisdropped = false
group by conname, foreign_schema, foreign_table, target_schema, target_table)
select f.conname, f.foreign_schema, f.foreign_table, f.foreign_col, f.target_schema, f.target_table, f.target_col
from fk_with_names as f inner join unique_keys_with_names_agg as u on f.foreign_schema=u.target_schema and f.foreign_table=u.target_table and f.foreign_col=u.key_columns
order by target_schema, target_table, conname;