如何使用 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)
;
我必须在 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)
;