2012-08-06 25 views
6

que he usado Excel para generar numerosas SELECT declaraciones de una lista de los nombres de esquema de una base de datos con un gran número de esquemas idénticos:PostgreSQL combinan múltiples sentencias de selección

select result from foo.table limit 1; 
select result from bar.table limit 1; 
select result from doo.table limit 1; 

(foo, bar & doo son ejemplos de mis esquemas, hay cientos en realidad).

Cada SELECT devolverá un solo resultado. Simplemente quiero una columna result con tantas filas como esquemas hay. Luego puedo copiar esto nuevamente en Excel contra los nombres de esquema.

Cuando ejecuto la consulta anterior consigo 1 fila, con los demás se descartan:

 
Query result with 1 row discarded. 

Query result with 1 row discarded. 

Total query runtime: 40 ms. 
1 row retrieved. 

He intentado usar UNION ALL, pero el limit 1 estoy usando para garantizar una fila única se devuelve desde cada esquema la tabla aparece para evitar que esto funcione.

¿Cómo puedo evitar que las demás filas se descarten, o escribir una consulta que devolverá los valores que necesito (dos columnas - schema_name, result - one row para cada esquema) de una manera más eficiente?

Respuesta

10

Simplemente envuelva declaraciones individuales entre paréntesis para hacer la sintaxis inequívoca:

(SELECT result FROM tbl1 LIMIT 1) 
UNION ALL 
(SELECT result FROM tbl2 LIMIT 1) 

El manual about UNION es muy clara al respecto:

select_statement es cualquier SELECT declaración sin una ORDER BY, LIMIT , FOR UPDATE, o FOR SHARE cláusula. (ORDER BY y LIMIT se puede unir a una subexpresión si se encierra entre paréntesis. Sin paréntesis, se tomarán estas cláusulas de aplicar al resultado de la UNION, no a su expresión de entrada de la derecha.)

5

Envolver una subconsulta lo evitará, pero se pone un poco feo.

SELECT result FROM (select 'a'::text AS result from foo limit 1) a 
UNION ALL 
SELECT result FROM (select 'b'::text AS result from bar limit 1) b 

ACTUALIZACIÓN

Véase la respuesta de Erwin. Es mejor.

+0

Gracias, eso es genial. Todo un feo trabajo, así que estoy contento con algo que funciona, ¡y esto funciona! –

+0

Cuando una consulta se pone fea en PostgreSQL, la mayoría de las veces, una solución más elegante está a la vuelta de la esquina. ;) –

+0

Si le molesta que la respuesta aceptada de antes en el día fuera mejorada en función de sus adiciones, la eliminaría. Pero parece que no puedo eliminar una respuesta de aceptación. – Glenn

-1
create view my_data1 
AS 
with data as 
(
    select student_id,sum(marks) as total_marks 
    from marks_marks 
    group by 1 
) , 
data1 as 
(
    select id, name 
    from students_class 
), 
data2 as 
(
    select applicant_name, 
      id, 
      class_name 
    from students_students 
) 
select data2.applicant_name , 
     data1.name as class_name , 
     data.total_marks 
from data2 
join data1 on data1.id = data2.class_name 
join data on data.student_id = data2.id 



select * from my_data1 
+0

Gracias por este fragmento de código, que podría proporcionar alguna ayuda limitada a corto plazo. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor a largo plazo mostrando * why * esta es una buena solución al problema, y ​​lo haría más útil para los lectores futuros con otras preguntas similares. Por favor [edite] su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho. –

Cuestiones relacionadas