关于 WHERE EXISTS(...) 中子查询的问题
Posted
技术标签:
【中文标题】关于 WHERE EXISTS(...) 中子查询的问题【英文标题】:Questions about subquery in WHERE EXISTS(...) 【发布时间】: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 一部分的子查询将为每个“客户”运行一次。对吗?
谢谢。
【问题讨论】:
你会在这里找到东西***.com/questions/14190788/… 谢谢,但我不明白这与我的要求有什么关系。 该示例中确实存在令人讨厌的错字。 WRT 最后一个问题:是和否。可以认为查询运行就好像为外部表的每一行执行一个布尔探测。但是在实践中会生成一个非常巧妙的查询计划,基本上是一个简化为布尔结果加上外部元组的连接。检查查询计划,你会看到。 @joop:谢谢,这是很棒的信息。这个问题的主要动机是确保我可以将子查询视为针对每个人customer.customer_id
运行。很高兴知道事情已经优化。我会按照你的建议看一下查询计划。
好吧,只有当连接字段(或多个字段)是 PK 或 FK 或索引可用时,事情才会得到优化。通常是这样。
【参考方案1】:
你完全正确。这似乎是 PostgreSQL 文档中的一个错字……顺便说一句,这很令人困惑。
关于最后一个问题,考虑为每个客户运行也是一个好方法。
【讨论】:
好的,谢谢。我盯着它看了一会儿,认为教程一定有问题。我认为这是来自第 3 方网站,所以我不认为它实际上是官方文档。也感谢您解决最后一个问题。以上是关于关于 WHERE EXISTS(...) 中子查询的问题的主要内容,如果未能解决你的问题,请参考以下文章
MySQL中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍