2013-06-24 28 views
1

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

我的麻烦开始于具有上连接表两个以上的记录,让我告诉你一个样本

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 

直到我在这里正在变色,a.idb.updated。我需要完整的table_b列,但是当我尝试向我的查询添加一个新列时,Postgres告诉我需要将我的列添加到GROUP BY条件才能完成查询,并且结果不是我所知寻找。

我想找到一种方法来获得此列表。

+0

您不应该接受语法错误的答案。这是愚弄其他人寻求帮助。 –

+0

老实说,他们两个都是我的问题,因为我对这个问题的知识还不够多,我不知道他们中的哪一个是正确的或者是语法上的,我只是接受第一个,在阅读之后,我正在考虑使用您的解决方案并了解更多信息,但在选择答案时绝对不可以。 – Carlos

+0

“Both”?有三个答案,你接受了一个不起作用的答案。 –

回答

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; 

详细此技术说明以及替代下此密切相关的解决方案问题:
Select first row in each GROUP BY group?

+0

我有一个与性能有关的大问题,我在这里发布http://stackoverflow.com/questions/18545911/getting-last-rows-by-date-on-a-large-postgresl-data-基础 – Carlos

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 

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

+0

我在答案上改变了我的选择,因为我正在读更多关于它的事情,Erwin问题是正确的问题。我希望在我的选择上不会让你失望,也是标志,但是欧文给了我更多的选择和解释。非常感谢你的时间 – Carlos

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 
+0

我试过这个答案,但是告诉我,t。*必须包含在GROUP BY – Carlos

+0

@Carlos:抱歉,GROUP BY应该不包含在查询中 - I现在已经纠正了它。 –

+0

非常感谢您的时间,我选择了Erwin的答案,因为它有更多的解释,但它与您的答案类似。非常感谢 – Carlos