PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

excluindo campos duplicados em uma junção


Não há sintaxe de exclusão de coluna no SQL, há apenas sintaxe de inclusão de coluna (através do operador * para todas as colunas ou listando os nomes das colunas explicitamente).

Gere uma lista apenas das colunas que você deseja


No entanto, você pode gerar a instrução SQL com suas centenas de nomes de coluna, menos as poucas colunas duplicadas que você não deseja, usando tabelas de esquema e algumas funções internas de seu banco de dados.
SELECT
    'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
        SELECT 'demographics' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'demographics' 
        AND column_name NOT IN ('zip')
        UNION ALL
        SELECT 'community' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'community' 
        AND column_name NOT IN ('fips')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

Isso apenas imprime a instrução, não a executa. Em seguida, basta copiar o resultado e executá-lo.

Se você deseja gerar e executar a instrução dinamicamente de uma só vez, leia sobre como executar SQL dinâmico no Documentação do PostgreSQL .

Anexar os nomes das colunas com o nome da tabela


Alternativamente, isso gera uma lista de seleção de todas as colunas, incluindo aquelas com dados duplicados, mas as alias para incluir também o nome da tabela de cada coluna.
SELECT
    'SELECT ' || ARRAY_TO_STRING(ARRAY(
        SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
        FROM information_schema.columns
        WHERE table_name in ('sampledata', 'demographics', 'community')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

Novamente, isso apenas gera a instrução. Se você quiser gerar e executar a instrução dinamicamente, precisará aprimorar a execução dinâmica de SQL para seu banco de dados, caso contrário, apenas copie e execute o resultado.

Se você realmente deseja um separador de ponto nos aliases de coluna, terá que usar aliases entre aspas duplas, como SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . No entanto, aliases com aspas duplas podem causar complicações extras (sensibilidade a maiúsculas e minúsculas, etc.); então, usei o caractere sublinhado para separar o nome da tabela do nome da coluna dentro do alias, e os aliases podem ser tratados como nomes de colunas regulares de outra forma.