gpt4 book ai didi

SQL/PostgreSQL 左连接忽略左表上的 "on = constant"谓词

转载 作者:行者123 更新时间:2023-11-29 12:47:15 24 4
gpt4 key购买 nike

SQL left join 查询忽略 left 表上的 ON column = constant 谓词。
但是,它关心 right 表上的另一个 ON column = constant 谓词。

如果我将左表的 ON column = constant 移至 WHERE 子句,查询将按预期工作。

对于左表,如果我将 column = constant 放在查询的 WHERE 部分,或者放在查询的 JOIN ... ON 部分,为什么这很重要?

(发生的情况是,左表 ON column = constant 条件被推到“JOIN Filter”步骤,似乎被忽略了。)

详细信息:

EXPLAIN ANALYZE
select * from DW1_PAGE_PATHS t left join DW1_PAGES g
on t.TENANT = g.TENANT
and t.PAGE_ID = g.GUID
and g.GUID = 'abcdefg' -- works
and t.CANONICAL = 'C' -- "ignored", unless moved to `where` clause
where t.TENANT = '72'
and PARENT_FOLDER like '/%';

这里(下方)是执行计划。请注意,t.CANONICAL = 'C' 已被推到“JOIN Filter”步骤,而 g.GUID = 'abcdefg' 过滤器直接在正确的时候发生正在扫描表格。

 Nested Loop Left Join  (cost=... actual time=...)
Join Filter: (((t.canonical)::text = 'C'::text)
AND ((t.tenant)::text = (g.tenant)::text)
AND ((t.page_id)::text = (g.guid)::text))
-> Seq Scan on dw1_page_paths t
Filter: (((parent_folder)::text ~~ '/%'::text)
AND ((tenant)::text = '72'::text))
-> Seq Scan on dw1_pages g
Filter: (((tenant)::text = '72'::text)
AND ((guid)::text = 'abcdefg'::text))

(另一个问题:为什么使用 t.canonical = 'C' 的“加入过滤器”不能过滤掉 canonical 不是 'C' 的行?它没有。)

(PostgreSQL 版本 psql(9.1.6,服务器 9.1.1)。)

这是一个类似查询的链接,但答案没有解释为什么如果您将左表 ON column = constant 移动到 where 子句代替: Add condition while using LEFT OUTER JOIN

最佳答案

重点是 LEFT [OUTER] JOINON 子句仅规定是否连接了右表中的行。

过滤左表中的行。如果你想这样做,表达式必须进入 WHERE 子句(正如你已经发现的那样)或 [INNER] JOIN 的 ON 子句
这一切都是设计使然。

关于SQL/PostgreSQL 左连接忽略左表上的 "on = constant"谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13699945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com