sql >> Base de Datos >  >> RDS >> PostgreSQL

excluyendo campos duplicados en una combinación

No hay una sintaxis de exclusión de columnas en SQL, solo hay una sintaxis de inclusión de columnas (a través del operador * para todas las columnas, o enumerando los nombres de las columnas explícitamente).

Generar una lista de las únicas columnas que desea

Sin embargo, podría generar la declaración SQL con sus cientos de nombres de columna, menos las pocas columnas duplicadas que no desea, usando tablas de esquema y algunas funciones integradas de su base de datos.

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

Esto solo imprime la declaración, no la ejecuta. Luego simplemente copia el resultado y ejecútalo.

Si desea generar y ejecutar la declaración dinámicamente de una sola vez, puede leer sobre cómo ejecutar SQL dinámico en Documentación de PostgreSQL .

Anteponer los nombres de las columnas con el nombre de la tabla

Alternativamente, esto genera una lista de selección de todas las columnas, incluidas aquellas con datos duplicados, pero luego les asigna un alias para incluir también el nombre de la tabla de cada columna.

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

Nuevamente, esto solo genera la declaración. Si desea generar y ejecutar la declaración dinámicamente, deberá repasar la ejecución de SQL dinámico para su base de datos; de lo contrario, simplemente copie y ejecute el resultado.

Si realmente desea un separador de puntos en los alias de columna, tendrá que usar alias entre comillas dobles como SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"' . Sin embargo, los alias entre comillas dobles pueden causar complicaciones adicionales (distinción de mayúsculas y minúsculas, etc.); por lo tanto, utilicé el carácter de subrayado en su lugar para separar el nombre de la tabla del nombre de la columna dentro del alias, y los alias se pueden tratar como nombres de columna regulares de otra manera.