我有两个表:contracts
和contract_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/