有没有一种方法可以提示postgres,它应该只在以下情况下尝试执行连接查找 in_table_b
准备好了吗?这纯粹是性能优化,不会改变结果。
Table A:
id Serial
in_table_b Boolean
Table B:
id Int (Foreign Key A.id)
foobar Text
当前查询:
SELECT A.id, A.in_table_b, B.foobar FROM A LEFT JOIN B ON a.id = B.id;
我想要一个有效的子句:如果 in_table_b
是假的。但是,我确实希望返回a中的行,即使b中没有匹配的行。
1条答案
按热度按时间huwehgph1#
实际上,您不能(通常也不应该尝试)控制数据库执行查询的方式。sql是一种描述性语言:你告诉数据库你想要的结果,并相信它会在执行计划方面做出最好的决定——数据库设计者投入了大量精力来构建引擎,以找出最好的策略。
我只想再加一个条件
on
合同条款left join
; 这是最简单的表达方式:我推荐一个关于
a(in_table_b, id)
:这可能会以某种方式提示查询计划器如何继续(索引中列的顺序在这里很重要)。但是,它也可能认为布尔列不是很好的选择,因为基数不好(只有两个可能的值)。数据库仍然可以进行索引查找—实际上,这可能是最有效的选择。