2012-08-06 17 views
6

ho usato Excel per generare numerosi SELECT dichiarazioni di un elenco dei nomi di schema da un database con un gran numero di schemi identici:PostgreSQL combinare più istruzioni SELECT

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

(foo, bar & doo sono esempi dei miei schemi, ce ne sono centinaia nella realtà).

Ogni SELECT restituirà solo un risultato. Voglio semplicemente una colonna result con tutte le righe quanti sono gli schemi. Posso quindi copiare questo in Excel contro i nomi dello schema.

Quando eseguo la query di cui sopra ottengo 1 fila, con gli altri di essere scartati:

 
Query result with 1 row discarded. 

Query result with 1 row discarded. 

Total query runtime: 40 ms. 
1 row retrieved. 

Ho provato con UNION ALL, ma il limit 1 che sto usando per garantire una riga solo viene restituito da ogni schema appare la tabella per evitare che funzioni.

Come impedire l'eliminazione delle altre righe o scrivere una query che restituisca i valori necessari (due colonne: schema_name, risultato, una riga per ogni schema) in modo più efficiente?

risposta

10

Basta avvolgere singole istruzioni tra parentesi per rendere la sintassi inequivocabile:

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

Il manual about UNION è molto chiaro in proposito:

select_statement è un qualsiasi SELECT dichiarazione senza un ORDER BY, LIMIT , FOR UPDATE o FOR SHARE clausola. (ORDER BY e LIMIT può essere attaccato ad una sottoespressione se è racchiuso tra parentesi. Senza parentesi, verranno prese queste clausole applicare al risultato della UNION, non alla sua espressione ingresso destra.)

5

Il wrapping in una sottoquery si aggira, ma diventa un po 'brutto.

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 

UPDATE

risposta di See Erwin. È meglio.

+0

Grazie, è fantastico. Un po 'di brutto lavoro a tutto tondo, quindi sono contento di qualcosa che funziona, che fa! –

+0

Quando una query diventa brutta in PostgreSQL, il più delle volte, una soluzione più elegante è dietro l'angolo. ;) –

+0

Se ti dà fastidio che la risposta accettata di prima durante il giorno sia stata migliorata in base alle tue aggiunte, l'avrei eliminata. Ma non riesco a cancellare una risposta di accettazione. – 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

Grazie per questo snippet di codice, che potrebbe fornire una guida limitata a breve termine. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore a lungo termine mostrando * perché * questa è una buona soluzione al problema e lo renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –

Problemi correlati