如何使用 Postgresql 在另一个 Select 中执行 Select

How to do a Select in another Select with Postgresql

我必须在 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 吗?

有两种选择。您可以使用 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 (
          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 演示用例。

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

数据库引擎的优化器可能足够聪明,可以避免额外的成本(在 fiddle 的玩具示例中应该如此),但您必须查看解释计划才能确定。

请注意,这主要是 'correlated subqueries' 的问题,即。如图所示嵌入的查询取决于嵌入。您的示例似乎属于这种类型,因为您使用了未在任何地方定义的 table 别名 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)
     ;