postgresql - SQL 最大日期左连接

标签 postgresql optimization sql-tuning

我有两个表:contractscontract_descriptions

contract_descriptions 上有一个名为 contract_id 的列,该列与 contracts 表记录中的列相同。

我正在尝试加入 contract_descriptions 上的最新记录:

SELECT *
FROM contracts c
LEFT JOIN contract_descriptions d ON d.contract_id = c.contract_id
AND d.date_description =
  (SELECT MAX(date_description)
   FROM contract_descriptions t
   WHERE t.contract_id = c.contract_id)

它确实有效,但是这是高效的方法吗?有没有办法避免第二个SELECT

最佳答案

您也可以使用DISTINCT ON:

SELECT * FROM contracts c LEFT JOIN (
    SELECT DISTINCT ON (cd.contract_id) cd.* FROM contract_descriptions cd
    ORDER BY cd.contract_id, cd.date_description DESC
) d ON d.contract_id = c.contract_id

DISTINCT ON 每个 contract_id 仅选择一行,而排序子句 cd.date_description DESC 确保它始终是最后一个描述。

性能取决于许多值(例如表大小)。无论如何,您都应该使用 EXPLAIN 来比较这两种方法。

关于postgresql - SQL 最大日期左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744648/

相关文章:

sql - 调整/重写具有许多左外连接和重型表的 SQL 查询

SQL Server 查询 : Union vs Distinct union all performance

sql - Postgresql:是否需要在作为复合唯一约束一部分的列上定义单列索引?

sql - 用同一列中的先前值填充空值

postgresql - 在批处理文件中运行命令

algorithm - 优化算法的技巧

oracle - 如何查看 Oracle 中查询转换器生成的查询

sql - 在 Postgres 中爬升父/子数据库关系

java - 在Java中计算二项式系数的最快方法

java - 安卓开发 : Avoiding Internal Getters/Setters?