Estou escrevendo consultas que leem tabelas idênticas em bancos de dados e esquemas e preciso que as colunas incluam de qual esquema e tabela vem uma linha.
Ao pesquisar durante a criação deste post, encontrei esta resposta
SELECT u.*, n.nspname as schema, u.tableoid::regclass::text as table_or_view
FROM uses u
JOIN pg_class c ON c.oid = u.tableoid
JOIN pg_namespace n ON c.relnamespace = n.oid
Isso agora inclui o esquema e a tabela ou visualização.
Quais junções eu preciso agora para adicionar o banco de dados também?
Talvez isso possa ajudar:
Obtenha o nome do banco de dados com
current_database()
o mustaccio fornecido.Seu alias de coluna "table_or_view" indica que você planeja usar isso para visualizações também, mas
VIEW
s não tem umtableoid
. (Exceto paraMATERIALIZED VIEW
s, que são construídos em torno de tabelas físicas reais em oposição a visualizações simples.)Se você for ingressar em
pg_class
de qualquer maneira, faz mais sentido enviarpg_class.relname
diretamente, em vez de converter otableoid
:Se for apenas para tabelas (e não para visualizações), você pode usar
u.tableoid::regclass::text
. E você não precisa de junções para mais tabelas.A saída é qualificada pelo esquema apenas se o caminho de pesquisa do esquema
search_path
atual exigir isso. Para gerar sempre o nome do esquema, defina um vaziosearch_path
para a consulta. Mas então você tem que qualificar o esquema de sua tabela para encontrá-lo:Você vai querer manter o seu atual
search_path
. Você pode redefini-lo após a consulta. Em vez disso, basta configurá-lo localmente para a consulta começar:O manual: