首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在外部联接中,普通筛选条件从何而来?

在外部联接中,普通筛选条件从何而来?
EN

Stack Overflow用户
提问于 2018-06-21 13:29:39
回答 2查看 110关注 0票数 0

从PostgreSQL文档中,在解释EXPLAIN命令的基本知识时:

在处理外部联接时,您可能会看到连接计划节点同时具有“连接筛选器”和普通“筛选器”条件。联接筛选条件来自外部联接的ON子句,因此失败连接筛选条件的行仍然可以作为空扩展行发出。但是,在外部连接规则之后应用普通筛选条件,因此可以无条件地删除行。在内部联接中,这些类型的过滤器之间没有语义区别。

“联接筛选条件来自外部联接的ON子句”。那么在外部连接中,普通的过滤条件从何而来?

你能举几个例子吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-21 13:59:30

这里有一个小小的例子,可以启发你:

代码语言:javascript
复制
CREATE TABLE a(a_id) AS VALUES (1), (3), (4);
CREATE TABLE b(b_id) AS VALUES (1), (2), (5);

现在我们必须强制一个嵌套的循环连接:

代码语言:javascript
复制
SET enable_hashjoin = off;
SET enable_mergejoin = off;

我们的查询是:

代码语言:javascript
复制
SELECT *
FROM a
   LEFT JOIN b ON a_id = b_id
WHERE a_id > coalesce(b_id, 0);

 a_id | b_id 
------+------
    3 |     
    4 |     
(2 rows)

计划是:

代码语言:javascript
复制
                QUERY PLAN
------------------------------------------
 Nested Loop Left Join
   Join Filter: (a.a_id = b.b_id)
   Filter: (a.a_id > COALESCE(b.b_id, 0))
   ->  Seq Scan on a
   ->  Materialize
         ->  Seq Scan on b

“普通过滤器”是在联接之后应用的条件。

认为WHERE子句中的条件与JOIN … ON子句中的条件相同是一个常见的错误。这只是内部连接的情况。对于外部联接,结果中还包括来自外部不满足条件的行。

这就需要有两个不同的过滤器。

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 13:47:47

在Postgres文档的其他地方使用的“普通过滤条件”一词没有其他用法,因此我怀疑作者的意思是“普通”一词字面上是指没有修饰或精心修饰的;简单的或普通的。

因此,他们实际上是在说:“当筛选器应用到外部联接的ON子句中时,被连接的表或派生表在发生之前只是简单地被过滤,这将导致表中的任何列或结果集中的派生表为null”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50969814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档