16

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

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

( foo, bar&doo是我的模式的例子,实际上有数百个)。

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

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

丢弃 1 行的查询结果。

丢弃 1 行的查询结果。

总查询运行时间:40 毫秒。
检索到 1 行。

我试过使用UNION ALL,但limit 1我用来确保每个模式表只返回一行似乎阻止了它的工作。

我怎样才能防止其他行被丢弃,或者编写一个查询以更有效的方式返回我需要的值(两列 - schema_name,结果 - 每个模式一行)?

4

3 回答 3

31

将各个子语句括在括号中以使语法明确:

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

关于这个问题的手册UNION非常清楚:

select_statement是任何SELECT没有ORDER BY, LIMIT, FOR UPDATE, orFOR SHARE子句的语句。(ORDER BY并且LIMIT可以附加到子表达式,如果它被括在括号中。没有括号,这些子句将被应用于 的结果,而 UNION不是其右手输入表达式。)

于 2012-08-06T17:35:25.360 回答
8

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

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

更新

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

于 2012-08-06T13:07:49.367 回答
6
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
于 2018-01-17T09:32:54.307 回答