我必须在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
吗?
答案 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
);