Postgresql SQL在最长日期离开连接
我有两个表格:Postgresql SQL在最长日期离开连接,postgresql,optimization,sql-tuning,Postgresql,Optimization,Sql Tuning,我有两个表格:合同和合同描述 在contract\u descriptions上有一个名为contract\u id的列,该列在contracts表记录上相等 我正在尝试加入合同描述上的最新记录: SELECT * FROM contracts c LEFT JOIN contract_descriptions d ON d.contract_id = c.contract_id AND d.date_description = (SELECT MAX(date_description)
合同
和合同描述
在contract\u descriptions
上有一个名为contract\u id
的列,该列在contracts
表记录上相等
我正在尝试加入合同描述
上的最新记录:
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)
这是可行的,但这是最有效的方法吗?有没有办法避免第二次
选择
?您也可以选择在上使用DISTINCT:
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\u id
只选择一行,而sort子句cd.date\u description DESC
确保它始终是最后一个描述
性能取决于许多值(例如,表大小)。在任何情况下,您都应该将这两种方法与EXPLAIN
进行比较。您的查询在我看来没有问题。从另一个表按某种顺序仅连接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;
你的数据库名是什么?数据库名也是合同我的意思是你的RDBMS是什么?像MySQL或MSSQL或其他?数据库是PostgreSql一般来说,你的查询对我来说没问题。但是,如果您可以从两个表中添加具有精确预期输出的示例数据,这将更有帮助。