【问题标题】:How to add 2 columns to existing query result based on another query?如何根据另一个查询向现有查询结果添加 2 列?
【发布时间】:2020-10-03 13:38:28
【问题描述】:

我有一个这样的查询:

SELECT 
   field1 as field1 , 
   field2 as field2 , 
   (select count(*) from ... where ...=field1) as field3
FROM
 ...

而且效果很好 - 我在结果中看到 3 列

我需要为内部查询再添加一列:

SELECT 
       field1 as field1 , 
       field2 as field2 , 
       (select count(*) as my_count, sum(*) as my _sum from ...where ...=field1 ) as field3
    FROM
     ...

这种语法不起作用。

我怎样才能实现它?

【问题讨论】:

  • oracle 还是 postgres?请仅标记您正在运行的一个数据库。
  • @GMB,它应该适用于它们。它对我们的应用程序的要求

标签: sql oracle postgresql join subquery


【解决方案1】:

这个部分查询使它不确定你真正想要什么,但我希望子查询实际上关联到外部查询(否则,你可以只是cross join)。如果是这样,典型的解决方案是横向连接。

在 Postgres 中:

select 
   field1 as field1, 
   field2 as field2, 
   x.*
from ...
left join lateral (
     select count(*) as my_count, sum(*) as my _sum from ... 
) x

Oracle 从版本 12 开始支持横向连接。您只需将 left join lateral 替换为 outer apply

【讨论】:

  • 是否有任何ANSI兼容的解决方案?
  • @gstackoverflow:lateral join 是 ANSI SQL。但是,您可能知道,数据库在标准的实现方面差异很大。 Oracle 和 Postgres 的横向连接语法不一样,就是这样......
  • @gstackoverflow 。 . .这是 ANSI 兼容的。横向连接是标准 SQL。
  • hm 我们使用 oracle 9 (。如果可能的话,我只想为两个数据库编写相同的 SQL
  • 我的Oracle版本是9,那个版本有解决办法吗?
【解决方案2】:

您可以使用 CTE(通用表表达式)来预先计算值:

WITH
q as (select count(*) as my_count, sum(*) as my _sum from ... )
SELECT 
       field1 as field1 , 
       field2 as field2 , 
       q.my_count as field3, 
       q.my_sum as field4
FROM
...
CROSS JOIN q

或者...您总是可以使用性能较低、更简单的方法:

SELECT 
       field1 as field1 , 
       field2 as field2 , 
       (select count(*) from ... ) as field3,
       (select sum(*) from ... ) as field4
    FROM
     ...

【讨论】:

  • 怎么样 SELECT field1 as field1 , field2 as field2 FROM ... CROSS JOIN (select count() as my_count, sum() as my _sum from ... )
  • @gstackoverflow 是的,这也很好用。但它需要有一个名字(例如q)。
  • 哦,对不起...这里的问题 (select count(*) as my_count, sum(*) as my _sum from ... ) as field3 在 where 子句中引用了`field1`...所以它不起作用
  • @gstackoverflow 然后这些值来自“相关子查询”。您可以在此答案中使用第二个选项,或在其他答案中使用“横向”查询。
  • @gstackoverflow 相关子查询很昂贵。您要检索多少行?
【解决方案3】:

您的信息有限(有点令人困惑 - 2 个数据库,sum(*) ...)信息,

逻辑如下:

SELECT 
       field1 as field1 , 
       field2 as field2 , 
       (select count(*) from ... ) as my_count,
       (Select sum(<my field>) from ...) as my _sum 
    FROM
     ...

【讨论】:

  • 是的,现在它以这种方式工作,但看起来查询执行了两次并且不是最佳的
  • 您必须提供数据库和所有表名等,以便我提供最佳查询
  • 信息不够
【解决方案4】:

以下内容似乎可以满足您的要求,并且在 Oracle 9i 中应该可以正常工作:

SELECT t.field1, 
       t.field2,
       x.my_count,
       x.my_sum
  FROM SOME_TABLE t
  LEFT OUTER JOIN (select FIELD1,
                          count(*) as my_count,
                          sum(SOME_FIELD) as my_sum
                     from SOME_OTHER_TABLE
                     GROUP BY FIELD1) x
    ON x.FIELD1 = t.FIELD1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多