2012-08-06 120 views
6

我用Excel来生成大量SELECT从架构名称的列表从数据库语句有大量相同的架构组成:PostgreSQL的组合多个选择语句

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,结果 - 每个模式一行)?

回答

10

只是包装个人陈述中括号使语法明确:

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

manual about UNION对此事非常清楚:

select_statement任何SELECT声明没有ORDER BYLIMITFOR UPDATEFOR SHARE子句。 (ORDER BYLIMIT可以,如果它被包围在括号附 到子表达式,没有 括号,这些条款将被视为适用于 UNION的结果,而不是它的右手输入表达。)

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 

UPDATE

见欧文的响应。这个比较好。

+0

谢谢,多数民众赞成。这是一个难以置信的工作,所以我很满意一些有用的东西,这是做的! – 2012-08-06 13:39:44

+0

当一个查询在PostgreSQL中变得越来越丑陋时,更多的时候,更优雅的解决方案即将到来。 ;) – 2012-08-06 17:38:55

+0

如果它让您困扰,那么从当天早些时候开始接受的答案基于您的增加而得到改进,我会删除它。但我似乎无法删除一个接受的答案。 – Glenn 2012-08-06 21:50:50

-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

感谢您使用此代码段,这可能会提供一些有限的短期帮助。通过展示*为什么*这是一个很好的解决方案,并且使它对未来的读者更有用,一个正确的解释[将大大提高](// meta.stackexchange.com/q/114762)其长期价值其他类似的问题。请[编辑]你的答案以添加一些解释,包括你所做的假设。 – 2018-01-17 10:24:24