Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql SQL在最长日期离开连接_Postgresql_Optimization_Sql Tuning - Fatal编程技术网

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一般来说,你的查询对我来说没问题。但是,如果您可以从两个表中添加具有精确预期输出的示例数据,这将更有帮助。