【问题标题】:Access Select Top 1 is not returning all rowsAccess Select Top 1 未返回所有行
【发布时间】:2016-06-09 13:23:23
【问题描述】:

我编写了一个选择查询来从一个表(一对多)中获取前 1 条记录,该表对每个 ID 都有多条记录。例如 ID = 1、2 和 3 .. 每个都有多行。该记录有一个日期字段,因此我按该日期字段排序并获取该日期的最新记录。当我运行查询时,我缺少 ID 1 和 4 的记录。我检查了表,这两个记录有多个记录。我做了一个不同的计数,它返回超过 3000,我的查询只返回 1400。同样的 ID存在于表 1 中。奇怪的是,当我删除 Top 1 时,我看到了所有的 ID。查询应该获取每个 ID 的第一条记录,对吗?

这是我的查询

SELECT
table2.RecentDate,
table2.Name,
table2.Address,
table2.City,
table2.State

FROM [table1] 

INNER JOIN 
        (   SELECT  Top 1 *
            FROM    [table2]  
            ORDER BY [table2].RecentDate DESC

        ) table2
ON [table1].[ID] = table2.[ID]

非常感谢任何帮助,

谢谢。

【问题讨论】:

  • 如果你做一个内连接,那么它只会显示表 1 和表 2 的 ID 都存在的结果。因此,table2 中可能没有具有这些 ID 的记录。你也只能得到按日期排序的前 1 个,这根本不考虑 ID..
  • 你的内部查询选择只有1条记录!!! TOP 1不是每个组的前1名,是整个数据的前1名!
  • 两个表中都存在ID
  • 为什么需要Table1

标签: sql ms-access


【解决方案1】:
SELECT
table2.RecentDate,
table2.Name,
table2.Address,
table2.City,
table2.State

FROM [table2] 

INNER JOIN 
        (   SELECT  [ID], MAX(RecentDate) dt
            FROM    [table2]  
            GROUP BY [ID]    
        ) t2
ON [table2].[ID] = t2.[ID] and [table2].[RecentDate] = t2.[dt]

【讨论】:

  • 如果您没有注意到,所有记录都来自 table2,而不是 table1。
  • 谢谢,我没有注意到 @sagi 我更改了它,因为我没有看到 Table1 的用途
【解决方案2】:

您可以从 table2 获取最大行来执行此操作。它应该比使用 TOP 以及返回您实际查找的内容更有效。

SELECT
table2.RecentDate,
table2.Name,
table2.Address,
table2.City,
table2.State
FROM [table1] T1
INNER JOIN  [table2]  T2
ON T1.[ID] = T2.[ID]
AND T2.RECENT_DATE = (SELECT MAX(RECENT_DATE) FROM table2 T2E WHERE T2.ID=T2E.ID)

如果你不需要 table1

select
table2.RecentDate,
table2.Name,
table2.Address,
table2.City,
table2.State
FROM [table2]  T2
WHERE T2.RECENT_DATE = (SELECT MAX(RECENT_DATE) FROM table2 T2E WHERE T2.ID=T2E.ID)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多