Postgresql 去掉一个连接

Postgresql 去掉一个连接,postgresql,left-join,Postgresql,Left Join,我有两张像这样的桌子: 创建表日志 程序int,时间int,a int,b int ; 插入日志 节目,时间,a,b 价值观 1, 5, 3, 4, 1, 10, 5, 6, 2, 5, 7, 8 ; 创建表参数 程序int,时间int,a_ref int,b_ref int ; 插入到参数中 节目,时间,a_参考,b_参考 价值观 1, 3, 4, 5, 1, 4, 6, 7, 2, 6, 8, 9 ; 对于日志中的每个条目,我可以在params imagine中找到相应的条目:程序的参考参数

我有两张像这样的桌子:

创建表日志 程序int,时间int,a int,b int ; 插入日志 节目,时间,a,b 价值观 1, 5, 3, 4, 1, 10, 5, 6, 2, 5, 7, 8 ; 创建表参数 程序int,时间int,a_ref int,b_ref int ; 插入到参数中 节目,时间,a_参考,b_参考 价值观 1, 3, 4, 5, 1, 4, 6, 7, 2, 6, 8, 9 ; 对于日志中的每个条目,我可以在params imagine中找到相应的条目:程序的参考参数,并且给定一个日志,我需要找到具有相同程序和小于日志时间戳的时间戳的最新条目

工作查询如下所示:

选择log.a、log.b、params.a\u ref、params.b\u ref 从日志 左外侧连接 选择* 从params 其中params.time
是否有机会消除它?

消除横向联接的一种方法是在派生表中使用distinct on,并在联接条件中添加对time列的限制:

SELECT log.a, log.b, params.a_ref, params.b_ref 
FROM log 
  LEFT JOIN (
     select distinct on (program) *
     from params 
     order by program, time desc 
  ) params ON log.program = params.program 
          and params.time < log.time

消除横向联接的一种方法是在派生表中使用distinct on,并将time列上的限制添加到联接条件中:

SELECT log.a, log.b, params.a_ref, params.b_ref 
FROM log 
  LEFT JOIN (
     select distinct on (program) *
     from params 
     order by program, time desc 
  ) params ON log.program = params.program 
          and params.time < log.time
SQL标准解决方案:

使用所有可能的参数连接日志 对于每个可能的参数,计算其顺序作为与log.time的距离,并对超出界限的最后一个值进行排序 排名为1的行是您想要的结果 选择a、b、a\u-ref、b\u-ref 从…起 选择log.a,log.b ,当log.time>params.time,然后params.a_ref else null结束为a_ref时的情况 ,当log.time>params.time时,则params.b_ref else null结束为b_ref ,按log.a、log.b、log.program order by log.time划分的分区上的行数SQL标准解决方案:

使用所有可能的参数连接日志 对于每个可能的参数,计算其顺序作为与log.time的距离,并对超出界限的最后一个值进行排序 排名为1的行是您想要的结果 选择a、b、a\u-ref、b\u-ref 从…起 选择log.a,log.b ,当log.time>params.time,然后params.a_ref else null结束为a_ref时的情况 ,当log.time>params.time时,则params.b_ref else null结束为b_ref
,按log.a、log.b、log.program order by log.time分区上的行数这实际上比其他解决方案要快,这并不少见。你真的有性能问题吗?如果你的表没有任何结构,不要期望DBMS有正常的行为。至少添加PKs+FKs。这实际上比其他解决方案更快,这并不少见。你真的有性能问题吗?如果你的表没有任何结构,不要期望DBMS有正常的行为。至少添加PKs+FKs。看起来不错!我现在正在评估性能问题的来源-当然,一个合适的外键可以解决这个问题,但现在我至少可以评估两个选项,一个选项是否可以补偿布局问题。这不会返回任何参数的相同结果,这些参数比同一程序的日志更新,看起来不错!我现在正在评估性能问题从何而来-当然,一个合适的外键可以解决这个问题,但现在我至少可以评估两个选项是否可以补偿布局问题。这不会返回任何参数的相同结果,这些参数比同一程序的日志更新