我有两个表:表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)
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我的直觉是,我不是以"最好的方式"做到这一点.它看起来像是聚合查询(即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
)
Run Code Online (Sandbox Code Playgroud)
只有在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
Run Code Online (Sandbox Code Playgroud)
这取决于巧合,MAX(TableB.Name)实际上是您想要获得的价值,并且与之一致MAX(TableB.DateStamp).但由于这种相关只是一个意外,因此GROUP BY查询是错误的.
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |