1

这是一个不止一次在这里问过的问题,但是我找不到我要找的东西。我正在寻找连接两个表,其中连接的表由按日期时间排序的最后一个寄存器设置,直到这里一切正常。

我的麻烦开始于连接表上有两条以上的记录,让我给你看一个示例

table_a
-------
id
name
description
created
updated

table_b
-------
id
table_a_id
name
description
created
updated

一开始我所做的是:

SELECT a.id,  b.updated
FROM table_a AS a 
LEFT JOIN (SELECT table_a_id, max (updated) as updated 
           FROM table_b GROUP BY table_a_id ) AS b 
ON a.id = b.table_a_id

直到这里我得到了 colsa.idb.updated. 我需要完整table_b的列,但是当我尝试向查询中添加新列时,Postgres 告诉我需要将我的列添加到 GROUP BY 条件才能完成查询,结果不是我想要的为了。

我正在尝试找到一种方法来获得此列表。

4

3 回答 3

2

DISTINCT ON或者是你的朋友。这是一个语法正确的解决方案:

SELECT a.id, b.updated, b.col1, b.col2
FROM   table_a as a
LEFT   JOIN (
   SELECT DISTINCT ON (table_a_id)
          table_a_id, updated, col1, col2
   FROM   table_b
   ORDER  BY table_a_id, updated DESC
   ) b ON a.id = b.table_a_id;

或者,从以下位置获取整行table_b

SELECT a.id, b.*
FROM   table_a as a
LEFT   JOIN (
   SELECT DISTINCT ON (table_a_id)
          *
   FROM   table_b
   ORDER  BY table_a_id, updated DESC
   ) b ON a.id = b.table_a_id;

在这个密切相关的问题下对此技术以及替代解决方案的详细说明:
选择每个 GROUP BY 组中的第一行?

于 2013-06-24T17:06:56.717 回答
2

您可以使用 Postgres 的distinct on语法:

select a.id, b.*
from table_a as a left join
     (select distinct on (table_a_id) table_a_id, . . . 
      from table_b
      order by table_a_id, updated desc
     ) b
     on a.id = b.table_a_id

在哪里. . .,你应该把你想要的列。

于 2013-06-24T14:37:45.047 回答
2

尝试:

SELECT a.id,  b.*
FROM table_a AS a 
LEFT JOIN (SELECT t.*, 
                  row_number() over (partition by table_a_id 
                                     order by updated desc) rn
           FROM table_b t) AS b 
ON a.id = b.table_a_id and b.rn=1
于 2013-06-24T14:39:20.587 回答