2008-10-16 40 views
9

Tengo una consulta grande en una base de datos PostgreSQL. la consulta es algo como esto:Ver error en PostgreSQL

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id... 

Cuando ejecuto esta consulta como una consulta SQL, el que devuelve la fila deseada.

Pero cuando intenta utilizar la misma consulta para crear una vista, se devuelve un error:

"Error: la columna 'ID' se especifica más de una vez."

(yo uso pgAdminIII al ejecutar las consultas.)

me adivinas esto sucede porque el conjunto de resultados tendrá más de una columna denominada "Identificación". ¿Hay alguna manera de resolver esto, sin escribir todos los nombres de columna en la consulta?

Respuesta

11

Esto sucede porque una vista tendría dos columnas identificadas con id, una de la tabla 1 y otra de la tabla 2, debido a la selección *.

Debe especificar qué id que desea en la vista.

SELECT table1.id, column2, column3, ... FROM table1, table2 
WHERE table1.id = table2.id 

La consulta funciona, ya que puede haber igualmente llamado columnas ...

postgres=# select 1 as a, 2 as a; 
a | a 
---+--- 
1 | 2 
(1 row) 

postgres=# create view foobar as select 1 as a, 2 as a; 
ERROR: column "a" duplicated 
postgres=# create view foobar as select 1 as a, 2 as b; 
CREATE VIEW 
+3

¿Hay alguna forma de anteponer automáticamente los nombres de las tablas a los nombres de las columnas en el resultado de una consulta SELECT *? – nnyby

-2

ninguna manera integrada en el lenguaje de resolverlo (y francamente, * es una mala práctica en general, porque puede causar defectos latentes a medida que cambian los esquemas de tablas: puede hacer table1. *, table2.acolumn, tabl2.bcolumn si quiere una tabla y selectivamente de otra), pero si PostgreSQL admite INFORMATION_SCHEMA, puede hacer algo como:

DECLARE @sql AS varchar 

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']' 
    + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN ('table1', 'table2') 
ORDER BY TABLE_NAME, ORDINAL_POSITION 

PRINT @sql 

Y pegue los resultados para ahorrar mucho tipeo. Necesitará alias manualmente las columnas que tienen el mismo nombre, por supuesto. Puede también el código-gen nombres únicos si se desea (pero no lo hago):

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] ' 
    + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']' 
    + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN ('table1', 'table2') 
ORDER BY TABLE_NAME, ORDINAL_POSITION 
+0

no hay nada como @SOMETHING en PostgreSQL. –

+0

Tampoco se usa [] para citar identificadores. Y no la función CHAR(). Y no hay ninguna declaración de IMPRESIÓN. –

11

Si sólo se unen columnas están duplicados (es decir, tienen los mismos nombres), entonces usted puede conseguir lejos con el cambio:

select * 
from a, b 
where a.id = b.id 

a:

select * 
from a join b using (id) 
+0

Esto no corrigió el error, pero de todos modos es una sintaxis más agradable. –

0

Si has llegado hasta aquí, ya que están tratando de utilizar una función como to_date y conseguir el error "definido más de una vez", tenga en cuenta que es necesario utilizar un alias de columna para las funciones , por ejemplo:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date 
Cuestiones relacionadas