【问题标题】:How to do a Select in another Select with Postgresql如何使用 Postgresql 在另一个 Select 中进行 Select
【发布时间】:2018-12-26 11:58:47
【问题描述】:

我必须在 Postgresql 的另一个 Select 中执行此查询:

SELECT COUNT(tn.autoship_box_transaction_id) 
FROM memberships.autoship_box_transaction tn 
WHERE tn.autoship_box_id = b.autoship_box_id

我必须使用子句WITH 吗?

【问题讨论】:

  • 您能否分享一下您打算如何应用此查询? sql查询有多种组合方式,CTE(又名WITH子句)当然是其中之一。

标签: sql postgresql select with-statement


【解决方案1】:

只要查询产生单个数据元素,您就可以使用它来代替属性:

SELECT (
          SELECT COUNT(tn.autoship_box_transaction_id) 
            FROM memberships.autoship_box_transaction tn 
           WHERE tn.autoship_box_id = b.autoship_box_id
       ) AS cnt
     , other_column
  FROM wherever
     ;

查看this SQL fiddle 演示用例。

如果数据库引擎实际上迭代结果集并对遇到的每条记录执行查询,则此方法通常会带来性能损失。

db 引擎的优化器可能足够聪明,可以避免额外的成本(它应该在小提琴的玩具示例中),但您必须查看说明计划以确定。

请注意,这主要是“相关子查询”的问题,即。如图所示嵌入的查询取决于嵌入。您的示例似乎属于这种类型,因为您使用了未在任何地方定义的表别名 b

可能会选择将子选择移动到from 子句(注意:此语句仅用于解释目的;您必须根据您的用例调整它,我只是在猜测这里):

SELECT stats.cnt
     , b.other_column
  FROM b_table b
  JOIN (
          SELECT COUNT(tn.autoship_box_transaction_id) cnt
               , tn.autoship_box_id
            FROM memberships.autoship_box_transaction tn 
        GROUP BY tn.autoship_box_id
       ) stats
    ON (stats.autoship_box_id = b.autoship_box_id)
     ;

【讨论】:

  • 我试试这个,效果很好。但是当我在第一个 Select 中添加第二个查询时,我无法添加第二个 JOIN:JOIN staging.memberships_autoship a ON a.id = b.autoship_id SELECT stats.cnt2, stats2.cnt3,stats1.cnt1 FROM staging .memberships_autoship_box b JOIN ( SELECT COUNT(bn.autoship_box_id) cnt1,bn.autoship_box_id FROM staging.memberships_autoship_box bn GROUP BY bn.autoship_box_id ) stats1 ON (stats1.autoship_box_id = a.id)
【解决方案2】:

有两种选择。您可以使用with 子句,如下所示:

WITH some_count AS (
   SELECT COUNT(tn.autoship_box_transaction_id) 
   FROM memberships.autoship_box_transaction tn 
   WHERE tn.autoship_box_id = b.autoship_box_id
)
SELECT * FROM some_count;

或者第二种选择是使用子查询,像这样:

SELECT
  *
FROM
  (
    SELECT COUNT(tn.autoship_box_transaction_id) 
    FROM memberships.autoship_box_transaction tn 
    WHERE tn.autoship_box_id = b.autoship_box_id
  );

【讨论】:

  • 为什么这个查询的结果总是一个: SELECT stats1.cnt1 FROM staging.memberships_autoship_box b JOIN staging.memberships_autoship a ON a.id = b.autoship_box_id JOIN ( SELECT COUNT(bn.autoship_box_id) cnt1 ,bn.autoship_box_id FROM staging.memberships_autoship_box bn GROUP BY bn.autoship_box_id ) stats1 ON (stats1.autoship_box_id = a.id)
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 2017-04-14
  • 2013-01-17
相关资源
最近更新 更多