【问题标题】:Combine multiple SELECT statements合并多个 SELECT 语句
【发布时间】:2020-07-24 08:23:49
【问题描述】:

我使用 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 行,其他行被丢弃:

丢弃 1 行的查询结果。 丢弃 1 行的查询结果。 总查询运行时间:40 毫秒。 检索到 1 行。

我曾尝试使用UNION ALL,但我用来确保每个模式表仅返回一行的limit 1 似乎会阻止此操作。

如何防止其他行被丢弃,或者编写一个查询以更有效的方式返回我需要的值(两列 - 架构名称,结果 - 每个架构一行)?

【问题讨论】:

    标签: sql postgresql union


    【解决方案1】:

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

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

    manual about UNION对此事很清楚:

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

    【讨论】:

      【解决方案2】:

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

      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
      

      更新

      见欧文的回应。更好。

      【讨论】:

      • 谢谢,太好了。有点丑陋的工作,所以我对可行的东西感到满意,它确实如此!
      • 当查询在 PostgreSQL 中变得丑陋时,通常会有一个更优雅的解决方案指日可待。 ;)
      • 如果您对当天早些时候接受的答案根据您的添加进行了改进感到困扰,我会删除它。但我似乎无法删除接受答案。
      • 您可以随时编辑。我没有建议删除。如果您确信我的答案更好,只需指出它(并可能解释原因)。你抄袭并没有为任何人增加价值,这对我不公平。
      【解决方案3】:
      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
      

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 其长期价值,通过展示为什么这是解决问题的好方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 2010-11-24
      • 2018-02-16
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多