postgresql联接2表
我有两个表tab1和tab2,tab2(tab1_id)引用tab1(id) tab2对tab1(id)有不同的值 我需要一个连接,它将tab1与tab2中的action列连接起来, 以及id的最新值postgresql联接2表,sql,postgresql,join,Sql,Postgresql,Join,我有两个表tab1和tab2,tab2(tab1_id)引用tab1(id) tab2对tab1(id)有不同的值 我需要一个连接,它将tab1与tab2中的action列连接起来, 以及id的最新值 tab1 :- id | user_file_id | created_date | modified_date ----+--------------+---------------------+--------------------- 2 |
tab1 :-
id | user_file_id | created_date | modified_date
----+--------------+---------------------+---------------------
2 | 102 | 2012-01-12 01:23:46 | 2012-03-04 16:52:28
4 | 104 | 2012-01-12 15:45:10 | 2012-01-15 02:23:40
6 | 106 | 2012-01-18 00:14:34 | 2012-01-24 20:17:49
7 | 107 | 2012-02-02 01:07:14 | 2012-04-17 09:29:17
8 | 108 | 2012-02-15 13:16:24 | 2012-03-26 10:30:51
9 | 109 | 2012-02-20 18:08:48 | 2012-04-09 06:14:58
10 | 110 | 2012-02-24 20:49:10 | 2012-03-23 11:36:41
11 | 111 | 2012-03-05 22:38:14 | 2012-03-16 04:29:35
(8 rows)
tab2:-
id | action | tab1_id
----+--------+---------
1 | 1 | 2
3 | 2 | 2
4 | 1 | 2
5 | 2 | 2
6 | 1 | 2
7 | 3 | 2
2 | 1 | 4
8 | 1 | 6
9 | 1 | 7
10 | 1 | 8
11 | 1 | 9
12 | 1 | 10
13 | 1 | 11
(13 rows)
tab1和tab2合并以获得如下输出:-
id | user_file_id | created_date | modified_date | action
----+--------------+---------------------+---------------------+--------
2 | 102 | 2012-01-12 01:23:46 | 2012-03-04 16:52:28 | 3
4 | 104 | 2012-01-12 15:45:10 | 2012-01-15 02:23:40 | 1
6 | 106 | 2012-01-18 00:14:34 | 2012-01-24 20:17:49 | 1
7 | 107 | 2012-02-02 01:07:14 | 2012-04-17 09:29:17 | 1
8 | 108 | 2012-02-15 13:16:24 | 2012-03-26 10:30:51 | 1
9 | 109 | 2012-02-20 18:08:48 | 2012-04-09 06:14:58 | 1
10 | 110 | 2012-02-24 20:49:10 | 2012-03-23 11:36:41 | 1
11 | 111 | 2012-03-05 22:38:14 | 2012-03-16 04:29:35 | 1
(8 rows)
尝试:
如果要允许tab1上的行在tab2上没有记录操作,请将联接更改为左联接
SELECT tab1.*, t2.action
FROM tab1
JOIN (
SELECT DISTINCT ON (tab1_id) tab1_id
, first_value(action) OVER (PARTITION BY tab1_id
ORDER BY id DESC) AS action
FROM tab2
) t2 ON tab1.id = t2.tab1_id
@马克已经提到了另一种选择左连接
你能帮我吗
SELECT tab1.*, t2.action
FROM tab1
JOIN (
SELECT DISTINCT ON (tab1_id) tab1_id
, first_value(action) OVER (PARTITION BY tab1_id
ORDER BY id DESC) AS action
FROM tab2
) t2 ON tab1.id = t2.tab1_id