繁体   English   中英

SQL 加入最新记录

[英]SQL Join to the latest record

我想以仅从其中一个表中获取最新记录的方式连接表:

以下是我的数据

表一:

+----+------+
| ID | Name |
+----+------+
|  1 | John |
|  2 | Tom  |
|  3 | Anna |
+----+------+

表二:

+----+----------+-----------+
| ID | Visit ID |   Date    |
+----+----------+-----------+
|  1 |     2513 | 5/5/2001  |
|  1 |    84654 | 10/5/2012 |
|  1 |      454 | 4/20/2018 |
|  2 |      754 | 4/5/1999  |
|  2 |      654 | 8/8/2010  |
|  2 |      624 | 4/9/1982  |
|  3 |     7546 | 7/3/1997  |
|  3 |   246574 | 6/4/2015  |
|  3 |    15487 | 3/4/2017  |
+----+----------+-----------+

加入后需要的结果:

+----+------+----------+-----------+
| ID | Name | Visit ID |   Date    |
+----+------+----------+-----------+
|  1 | John |      454 | 4/20/2018 |
|  2 | Tom  |      654 | 8/8/2010  |
|  3 | Anna |   246574 | 6/4/2015  |
+----+------+----------+-----------+

不同的数据库引擎使用不同的方法从每个组的表2中获得第一行(您可以在Google上搜索“ SQL窗口函数”和您的产品)。 由于您没有说明正在使用的引擎,因此无法提供最合适或性能最佳的解决方案。

下面的方法应该在大多数或所有SQL引擎中都有效,但是在大型数据集上并不是特别有效(它将受益于复合索引Table2(ID,Date))。 在引擎之间,如何指定表别名的详细信息可能有所不同,但是您可以以此为指导。 窗口函数解决方案可能会更有效。

 SELECT ID, Name, VisitID, Date FROM Table1 T1 INNER JOIN Table2 T2 +
   ON T1.ID = T2.ID 
   WHERE NOT EXISTS (SELECT * FROM Table2 T2B WHERE T2B.ID = T1.ID AND T2B.Date > T2.Date)

您可以使用过滤掉“最新访问”

从TABLE_TWO GROUP BY ID中选择ID,MAX(DATE);

然后,您可以将其加入TABLE_ONE(... ON .ID = .ID)以选择“名称”列,然后再次将其加入TABLE_TWO(... ON ID = ID AND DATE = DATE)。也是VISIT_ID。

特定的DBMS可能具有专有/特有的扩展名,通常用于使优化器做得更好(例如,使优化器了解“可以省去回到TABLE_TWO的连接”)。在这里考虑SELECT TOP 1 ...和喜欢。

我怀疑如果有SQL Server ,则可以使用APPLY

select o.*, tt.*
from Table_One o 
cross apply ( select top 1 t.VisitDate, t.Date
              from table_two t
              where t.id = o.id
              order by t.date desc
            ) tt;
SELECT ID,Name,Visit_ID,Date
FROM
    (SELECT *, ROW_NUMBER() OVER(PARTITION BY ID Date DESC) as seq
    FROM Table2 LEFT OUTER JOIN
         Table1 ON Table2.ID = Table1.ID) as mainTable
WHERE seq = 1

我不确定这是否正确,因为访问ID可能会将每条记录都丢给您,因此我不是100%肯定。 但是,您可以在这里找到一些很棒的文档: https : //www.w3resource.com/sql/aggregate-functions/max-date.php

select t1.ID,t1.Name,t2.visit_ID, Max(t2.Date) from Table_Two t2
inner join Table_One t1
on(t2.ID=t1.ID)
group by t1.ID,t1.Name,t2.visit_ID

像这样的东西应该可以工作,但我认为这也与@Erwin Smout建议的一样

select a.ID, t1.Name, a.date,t2.Visit_ID (
select ID, max(date)'date' from Table_Two 
group by ID) a
inner join Table_One t1
    on( a.ID=t1.ID)
inner join Table_Two t2
    on(a.ID=t2.ID and a.Date=t2.Date)

这是你问题的答案

SELECT t1.ID, t1.Name, t2.visit_id, t2.Date FROM table1 t1 INNER JOIN table2 t2 ON t1.ID = t2.ID WHERE NOT EXISTS (SELECT * FROM table2 t2b WHERE t2b.ID = t1.ID AND t2b.Date > t2.Date)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM