PostgreSQL结合了多个select语句

时间:2012-08-06 12:58:07

标签: sql postgresql union

我使用Excel从具有大量相同模式的数据库中的模式名称列表中生成大量SELECT语句:

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

foobar& doo是我的架构的示例,实际上有数百个。

每个SELECT只返回一个结果。我只想要一个列result,其行数与模式一样多。然后,我可以根据模式名称将其复制回Excel。

当我运行上面的查询时,我得到1行,其他行被丢弃:

Query result with 1 row discarded.

Query result with 1 row discarded.

Total query runtime: 40 ms.
1 row retrieved.

我已尝试使用UNION ALL,但我正在使用的limit 1确保仅从每个架构表返回一行,以防止此操作。

如何阻止其他行被丢弃,或者编写一个返回我需要的值的查询(两列 - schema_name,结果 - 每个模式一行)?

3 个答案:

答案 0 :(得分:19)

只需在括号中包含单个语句,以使语法明确:

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

manual about UNION对此事非常明确:

  

select_statement是没有SELECTORDER BY的任何LIMIT语句,   FOR UPDATEFOR SHARE条款。 (ORDER BYLIMIT可以附加   如果括在括号中,则表示子表达式。没有   括号中,这些条款将被视为适用于结果   UNION,而不是右手输入表达式。)

答案 1 :(得分:5)

在子查询中包装会解决它,但它有点难看。

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

<强>更新

请参阅Erwin的回复。它更好。

答案 2 :(得分: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