当前位置: 首页 > 面试题库 >

PostgreSQL,从2个表中选择,但仅从表2中选择最新元素

柴磊
2023-03-14
问题内容

嘿,我在PostgreSql中有2个表:

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

和一些数据:

文件:

| 1 | Test Title |

更新:

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

因此,所有更新都指向同一文档,但是所有更新的日期都不同。

我想做的是从文档表中进行选择,但还要包括基于日期的最新更新。

这样的查询应如何显示?这是我目前拥有的,但我列出的是所有更新,而不是我需要的最新更新:

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

包括; 我在查询中需要这个的原因是我想按更新模板中的日期排序!

编辑:此脚本已大大简化,因此我应该能够创建一个查询,该查询返回任意数量的结果,但包括最新的更新日期。我在考虑使用内部联接或左联接或类似的东西!


问题答案:

您可以创建一个派生表,其中每个document_id仅包含最新的“ updates”记录,然后针对该表加入“ documents”:

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)


 类似资料:
  • 我有一个问题...在表1中,我有一个id,我必须比较表2中的id,然后获取表2中的第二个id,并将其与表3进行比较,得到一个数据作为结果。例子 如果我查找id 1,结果必须是Sea。如果我查找id 2,结果必须是Hello。 谢谢!

  • `@实体公共类影片{ }' 公开课课时{ } 我有两张桌子 表A Id | name | date | Set 表B Id |日期|表A 我想选择TableB. date所在的所有tableA 我想从表格A,表格B中选择*表格B。日期 我想要一个TableA元素列表和一个TableB的少数元素列表 在此输入图像描述 在此输入图像描述

  • 问题内容: 当您限制通常用于分页的SQL查询返回的行数时,有两种方法可确定记录总数: 方法1 将选项包括在原始选项中,然后通过运行获取总行数: 方法二 正常运行查询,然后通过运行获取总行数 哪种方法最好/最快? 问题答案: 这取决于。请参阅有关此主题的MySQL Performance Blog帖子:http : //www.mysqlperformanceblog.com/2007/08/28/

  • 问题内容: 我有2个表:table_a和table_b。两者都包含一个名为“ open”的列。 我想编写一个查询,返回以下内容 我尝试以下查询: 这将为table_a.open的每个值返回具有table_b.open的每个值的表 我可以在这里误解别名的正确用法。有任何想法吗? 问题答案: 这不是您遇到的别名问题。您正在表上执行创建直角坐标结果集的操作。 这会乘以您的结果集,因此的每一行都直接与中的

  • 我创建了3个表:Employee、Department和EMPDept。 1)员工表字段为 我不知道在第三个表(即EmpDept)中包括哪些字段,以及如何将join应用于选择列 我的尝试

  • 问题内容: 通过在PG 9.1上使用libpq,我试图编写查询以从具有最高索引“ my_id”的行中获取值: 这给了我错误: 错误:WHERE子句中不允许聚合… 如何正确编写这样的查询? 问题答案: 如果您的目标是获取具有最高my_id值的行,则以下查询应达到相同的目标。