关于 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介绍

关于高级查询的知识

如何在 Knex 上使用 EXISTS 进行子查询?

关于sql中的exists,写上和不写是否没啥区别,是否只是提高了执行效率

MS Access 查询 WHERE NOT EXISTS

SQL WHERE EXISTS 掩盖了子查询中的错误