gpt4 book ai didi

sql - 这是 sql groupby 查询的候选对象吗?

转载 作者:行者123 更新时间:2023-12-04 14:35:22 26 4
gpt4 key购买 nike

我有两个表:TableA (ID [int, pk], Name [string])TableB (ID [int, pk], TableA_ID [int, fk], Name [string], DateStamp [datetime (dd/mm/yyyy hh:MM:ss)])。 TableA和TableB之间是一对多的关系。

对两个表进行内部联接会得到以下结果:

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

What I actually want is the following (each row from TableA and the last matching row from 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

This is the query that I'm using to achieve this:

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 等于 DateStamp< 时,才需要额外的 GROUP BY/.


对于您展示的具体示例,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 查询是错误的。

关于sql - 这是 sql groupby 查询的候选对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/609836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com