[英]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.