【发布时间】:2013-11-02 14:11:17
【问题描述】:
我对本教程页面中的这个示例感到困惑。 http://www.postgresqltutorial.com/postgresql-subquery/
SELECT
first_name,
last_name
FROM
customer
WHERE
EXISTS (
SELECT
1
FROM
payment
WHERE
payment.customer_id = payment.customer_id
);
您能告诉我子查询的要点吗?
我了解,如果子查询至少返回一个结果,EXISTS 会将结果集转换为布尔值“true”。但是在子查询的 WHERE 子句中,它看起来总是“真”,所以总是会选择一行,所以 EXISTS 总是“真”。
该示例是否打算在子查询中执行此操作?
WHERE
customer.customer_id = payment.customer_id
另外,我假设作为 WHERE 一部分的子查询将为每个“客户”运行一次。对吗?
谢谢。
【问题讨论】:
-
谢谢,但我不明白这与我的要求有什么关系。
-
该示例中确实存在令人讨厌的错字。 WRT 最后一个问题:是和否。可以认为查询运行就好像为外部表的每一行执行一个布尔探测。但是在实践中会生成一个非常巧妙的查询计划,基本上是一个简化为布尔结果加上外部元组的连接。检查查询计划,你会看到。
-
@joop:谢谢,这是很棒的信息。这个问题的主要动机是确保我可以将子查询视为针对每个人
customer.customer_id运行。很高兴知道事情已经优化。我会按照你的建议看一下查询计划。 -
好吧,只有当连接字段(或多个字段)是 PK 或 FK 或索引可用时,事情才会得到优化。通常是这样。
标签: sql postgresql