rails - must appear in the group by clause or be used in an aggregate function postgresql
Ver error en PostgreSQL (4)
Tengo una consulta grande en una base de datos PostgreSQL. La consulta es algo como esto:
SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...
Cuando ejecuto esta consulta como una consulta sql, devuelve la fila deseada.
Pero cuando intento usar la misma consulta para crear una vista, devuelve un error:
"error: columna" id "especificada más de una vez".
(Uso pgAdminIII al ejecutar las consultas).
Supongo que esto sucede porque el conjunto de resultados tendrá más de una columna llamada "id". ¿Hay alguna manera de resolver esto, sin escribir todos los nombres de columna en la consulta?
Eso sucede porque una vista tendría dos columnas con nombre de identificación, una de la tabla 1 y otra de la tabla 2, debido a la selección *.
Debes especificar qué id quieres en la vista.
SELECT table1.id, column2, column3, ... FROM table1, table2
WHERE table1.id = table2.id
La consulta funciona porque puede tener columnas igualmente nombradas ...
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
No hay una manera incorporada en el lenguaje para 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 quieres una tabla y selectivamente de otra), pero si PostgreSQL admite INFORMATION_SCHEMA, puedes 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. También puede codificar gen nombres únicos si lo desea (pero yo no):
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
Si solo se unen las columnas join (es decir, tienen los mismos nombres), entonces puede salirse con la suya cambiando:
select *
from a, b
where a.id = b.id
a:
select *
from a join b using (id)
Si llegó aquí porque está tratando de usar una función como to_date
y obtener el error "define más de una vez", tenga en cuenta que debe usar un alias de columna para funciones, por ejemplo:
to_date(o.publication_date, ''DD/MM/YYYY'') AS publication_date