嘿,我在PostgreSql中有两个表:

1 - documents: id, title
2 - updates: id, document_id, date

还有一些数据:

documents:

| 1 | Test Title |

updates:

| 1 | 1 | 2006-01-01 |
| 2 | 1 | 2007-01-01 |
| 3 | 1 | 2008-01-01 |

所以所有的更新都指向同一个文档,但是更新的日期都不同.

我试图做的是从documents表中进行 Select ,但也包括基于日期的最新更新.

这样的查询应该是什么样子?这是我目前拥有的更新,但我列出了所有更新,而不是我需要的最新更新:

SELECT * FROM documents,updates WHERE documents.id=1 AND documents.id=updates.document_id ORDER BY date

包括;我在查询中需要它的原因是我想按更新模板中的日期订购!

编辑:这个脚本非常复杂

推荐答案

您可以创建一个派生表,其中只包含每个文档id的最新"更新"记录,然后根据该表加入"文档":

SELECT d.id, d.title, u.update_id, u."date"
FROM documents d
LEFT JOIN
-- JOIN "documents" against the most recent update per document_id
(
SELECT recent.document_id, id AS update_id, recent."date"
FROM updates
INNER JOIN
(SELECT document_id, MAX("date") AS "date" FROM updates GROUP BY 1) recent
ON updates.document_id = recent.document_id
WHERE
  updates."date" = recent."date"
) u
ON d.id = u.document_id;

这将处理"未更新"的文档,例如:

pg=> select * from documents;
 id | title 
----+-------
  1 | foo
  2 | bar
  3 | baz
(3 rows)

pg=> select * from updates;
 id | document_id |    date    
----+-------------+------------
  1 |           1 | 2009-10-30
  2 |           1 | 2009-11-04
  3 |           1 | 2009-11-07
  4 |           2 | 2009-11-09
(4 rows)

pg=> SELECT d.id ...
 id | title | update_id |    date    
----+-------+-----------+------------
  1 | foo   |         3 | 2009-11-07
  2 | bar   |         4 | 2009-11-09
  3 | baz   |           | 
(3 rows)

Postgresql相关问答推荐

函数返回查询执行plpgsql时不存在列

使用多个分隔符拆分SQL

Org.postgresql.util.PSQLException:错误:函数LOWER(BYTEA)不存在

如何将存储的、生成的列添加到非常大的表中?

IF 块中的 CREATE FUNCTION 语句抛出错误,同时运行它自己的作品

Upper() 不会大写重音字符

Postgres 唯一 JSON 数组聚合值

在 Postgres 中查询 JSON 对象数组

更详细地解释 JOIN 与 LEFT JOIN 和 WHERE 条件性能建议

为什么 sqlalchemy 的默认列值不起作用

Select 中的 PostgreSQL 正则表达式捕获组

如何禁用 postgresql缓存优化?

如何启动 Postgres 服务器?

将数据从 MS SQL 迁移到 PostgreSQL?

为什么 rake db:migrate 有时会在 structure.sql 中添加尾随空格?

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

PostgreSQL/JDBC 和 TIMESTAMP 与 TIMESTAMPTZ

Postgres:为 CAST 失败定义一个默认值?

处理用户发送的string contains null byte

GRANT SELECT 特权使用一个语句对所有序列