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吗?
有两种选择。您可以使用该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)
只要查询生成单个数据元素,您就可以使用它代替属性:
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)
如果数据库引擎实际上迭代结果集并对遇到的每条记录执行查询,则此方法通常会带来性能损失。
数据库引擎的优化器可能足够聪明,可以避免额外的成本(在小提琴的玩具示例中应该如此),但您必须查看解释计划才能确定。
请注意,它主要是“相关子查询”的问题,即。如图所示嵌入的查询取决于嵌入。您的示例示例似乎是这种类型,因为您使用了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)