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

时间:2018-07-18 14:06:22

标签: sql postgresql select with-statement

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

2 个答案:

答案 0 :(得分:2)

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

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引擎实际上遍历结果集并对所遇到的每条记录执行查询,则此方法通常会降低性能。

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)
     ;

答案 1 :(得分:0)

有两个选项。您可以使用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
  );