当前位置:  开发笔记 > 编程语言 > 正文

这是一个sql groupby查询的候选者吗?

如何解决《这是一个sqlgroupby查询的候选者吗?》经验,为你挑选了1个好方法。

我有两个表:表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中的行.

任何帮助非常感谢.



1> Tomalak..:

不,这里不需要进行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查询是错误的.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有