SQL 在最大日期离开加入

SQL left join on maximum date

我有两个 table:contractscontract_descriptions

contract_descriptions 上有一个名为 contract_id 的列,它在 contracts table 条记录上是相等的。

我正在尝试加入 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 确保它始终是最后一个描述。

性能取决于许多值(例如,table 大小)。无论如何,您应该将这两种方法与 EXPLAIN.

进行比较

我觉得你的查询没问题。一种典型的按顺序从另一行 table 连接 n 行的方法是横向连接:

SELECT *
FROM contracts c
CROSS JOIN LATERAL
(
  SELECT *
  FROM contract_descriptions cd
  WHERE cd.contract_id = c.contract_id
  ORDER BY cd.date_description DESC
  FETCH FIRST 1 ROW ONLY
) cdlast;