如何使用 Postgresql 在另一个选择中进行选择

Jul*_*que 5 sql postgresql select with-statement

我必须在另一个SelectPostgresql 中执行此查询:

SELECT COUNT(tn.autoship_box_transaction_id) 
FROM memberships.autoship_box_transaction tn 
WHERE tn.autoship_box_id = b.autoship_box_id
Run Code Online (Sandbox Code Playgroud)

我必须使用该条款WITH吗?

Cam*_*ner 6

有两种选择。您可以使用该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;
Run Code Online (Sandbox Code Playgroud)

或者第二个选项是使用子查询,如下所示:

SELECT
  *
FROM
  (
    SELECT COUNT(tn.autoship_box_transaction_id) 
    FROM memberships.autoship_box_transaction tn 
    WHERE tn.autoship_box_id = b.autoship_box_id
  );
Run Code Online (Sandbox Code Playgroud)


col*_*sar 5

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

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
     ;
Run Code Online (Sandbox Code Playgroud)

看看这个演示用例的SQL 小提琴

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

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

请注意,它主要是“相关子查询”的问题,即。如图所示嵌入的查询取决于嵌入。您的示例示例似乎是这种类型,因为您使用了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)
     ;
Run Code Online (Sandbox Code Playgroud)