我有两个表:表A(ID [int, pk], Name [string])
和表B (ID [int, pk], TableA_ID [int, fk], Name [string], DateStamp [datetime (dd/mm/yyyy hh:MM:ss)])
,有表A和表B之间的一个一对多的关系.
两个表上的内部联接将给出以下结果:
TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp 1, 'File A', 'Version 1', 01/01/2009 15:00:00 1, 'File A', 'Version 2', 05/01/2009 08:15:00 1, 'File A', 'Version 3', 06/01/2009 19:33:00 2, 'File B', 'Version 1', 03/01/2009 09:10:00 2, 'File B', 'Version 2', 20/01/2009 20:00:00 3, 'File C', 'Version 1', 01/01/2009 17:00:00
我真正想要的是以下(TableA中的每一行和TableB中的最后一个匹配行):
TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp 1, 'File A', 'Version 3', 06/01/2009 19:33:00 2, 'File B', 'Version 2', 20/01/2009 20:00:00 3, 'File C', 'Version 1', 01/01/2009 17:00:00
这是我用来实现此目的的查询:
SELECT ta.ID, ta.Name, tb.Name, tb.DateStamp FROM TableA ta INNER JOIN TableB tb ON ta.ID = tb.TableA_ID WHERE tb.ID IN ( SELECT TOP 1 tb2.ID FROM TableB tb2 WHERE tb2.TableA_ID = ta.ID ORDER BY tb2.DateStamp DESC)
这是有效的,但我的直觉是,我不是以"最好的方式"做到这一点.它看起来像是聚合查询(即groupby)的候选者,但我没有任何运气.最后,我总是不得不使用子查询来获取我在TableB中的行.
任何帮助非常感谢.
不,这里不需要进行GROUP BY,这应该通过相关的子查询来解决:
SELECT TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp FROM TableA INNER JOIN TableB ON TableA.ID = TableB.TableA_ID AND TableB.DateStamp = ( SELECT MAX(DateStamp) FROM TableB WHERE TableA_ID = TableA.ID )
只有在TableB
具有相等TableA_ID
且相等的多个记录时,才需要额外的GROUP BY DateStamp
.
对于您显示的特定示例,GROUP BY查询恰好产生正确的结果.这仍然是错误的,因为正确的结果在这种情况下更具副作用.
SELECT TableA.ID, TableA.Name, MAX(TableB.Name) Max_TableBName, MAX(TableB.DateStamp) Max_TableBDateStamp FROM TableA INNER JOIN TableB ON TableA.ID = TableB.TableA_ID GROUP BY TableA.ID, TableA.Name
这取决于巧合,MAX(TableB.Name)
实际上是您想要获得的价值,并且与之一致MAX(TableB.DateStamp)
.但由于这种相关只是一个意外,因此GROUP BY查询是错误的.