我有两个表,第二个表用多个条目(1:n)连接到第一个表。
第一个表包含id_something (另一个表,但目前不重要)和每天date_day的条目。
+-----------+
| Table ONE |
+----+------+-------+----------+----------+
| id | id_something | date_day | created |
+----+--------------+----------+----------+
| 1 | 666 | 2019-1-1 | 2019-1-1 |
| 2 | 666 | 2019-1-1 | 2019-7-7 |
| 3 | 123 | 2019-1-1 | 2019-1-1 |
+----+--------------+----------+----------+第二个表连接到这个id并包含键值对。
+-----------+
| Table TWO |
+--------+--+--+-----+
| id_one | foo | bar |
+--------+-----+-----+
| 1 | 1 | 20 |
| 1 | 2 | 21 |
| 2 | 1 | 30 |
| 2 | 2 | 31 |
| 2 | 3 | 32 |
| 3 | 1 | 10 |
+--------+-----+-----+我想查询所有可能的连接,非常简单,它是一个连接:
SELECT *
FROM one
LEFT JOIN two
ON two.id_one = one.id;
+----+--------------+----------+----------+--------+-----+-----+
| id | id_something | date_day | created | id_one | foo | bar |
+----+--------------+----------+----------+--------+-----+-----+
| 1 | 666 | 2019-1-1 | 2019-1-1 | 1 | 1 | 20 |
| 1 | 666 | 2019-1-1 | 2019-1-1 | 1 | 2 | 21 |
| 2 | 666 | 2019-1-1 | 2019-7-7 | 2 | 1 | 30 |
| 2 | 666 | 2019-1-1 | 2019-7-7 | 2 | 2 | 31 |
| 2 | 666 | 2019-1-1 | 2019-7-7 | 2 | 3 | 32 |
| 3 | 123 | 2019-1-1 | 2019-1-1 | 3 | 1 | 10 |
+----+--------------+----------+----------+--------+-----+-----+现在,正如您所看到的,我还有一个created字段。id_something和date_day可能是相同的--但我只想拥有第二个表中最近的(created DESC)对。
因此,在这种情况下,查询应该返回:
+----+--------------+----------+----------+--------+-----+-----+
| id | id_something | date_day | created | id_one | foo | bar |
+----+--------------+----------+----------+--------+-----+-----+
| 2 | 666 | 2019-1-1 | 2019-7-7 | 2 | 1 | 30 |
| 2 | 666 | 2019-1-1 | 2019-7-7 | 2 | 2 | 31 |
| 2 | 666 | 2019-1-1 | 2019-7-7 | 2 | 3 | 32 |
| 3 | 123 | 2019-1-1 | 2019-1-1 | 3 | 1 | 10 |
+----+--------------+----------+----------+--------+-----+-----+但我不能让它起作用..。我试着使用不同的,甚至是子查询和用例构造,但是它要么不起作用,要么很不理想。组-by也不会返回每个连接对,而只返回表1中每一个id的一行。
为了实现我所希望的结果,我错过了什么?
(如果不使用Oracle专用的synthax,这将是一种奖励。)
发布于 2019-07-09 13:16:33
您可以使用分析函数:
SELECT *
FROM (SELECT o.* ROW_NUMBER() OVER (PARTITION BY id ORDER BY created DESC) as seqnum
FROM one o
) o LEFT JOIN
two t
ON t.id_one = o.id
WHERE o.seqnum = 1;发布于 2019-07-09 13:19:32
使用row_number(),获取最新的id_something,然后使用联接
select a.*,b.* from
(
select *,
row_number()over(partition by id_something order by created desc) rn from one
) a join two b ON b.id_one = a.id;
where rn=1https://stackoverflow.com/questions/56953461
复制相似问题