join

o2rvlv0m  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(305)

有没有一种方法可以提示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中没有匹配的行。

huwehgph

huwehgph1#

实际上,您不能(通常也不应该尝试)控制数据库执行查询的方式。sql是一种描述性语言:你告诉数据库你想要的结果,并相信它会在执行计划方面做出最好的决定——数据库设计者投入了大量精力来构建引擎,以找出最好的策略。
我只想再加一个条件 on 合同条款 left join ; 这是最简单的表达方式:

select a.id, a.in_table_b, b.foobar 
from a 
left join b on a.id = b.id and a.in_table_b;

我推荐一个关于 a(in_table_b, id) :这可能会以某种方式提示查询计划器如何继续(索引中列的顺序在这里很重要)。但是,它也可能认为布尔列不是很好的选择,因为基数不好(只有两个可能的值)。数据库仍然可以进行索引查找—实际上,这可能是最有效的选择。

相关问题