【问题标题】:Converting an access Last() function into a SQL Query将访问 Last() 函数转换为 SQL 查询
【发布时间】:2019-06-16 22:38:28
【问题描述】:

我正在尝试将此访问函数转换为等效的 SQL。

Last([Delivery Table].[Advice Number]) AS [LastOfAdvice Number]

由于 SQL 中不存在最后一个函数,所以我这样做了:

(SELECT TOP 1 [Delivery Table].[Advice Number] FROM
    (
    SELECT [Delivery Table].[Advice Number]   
    FROM [Delivery Table] ORDER BY [Delivery Table].[Advice Number] DESC
    ) AS [Advice Number Sorted]
) AS [LastOfAdvice Number]

上述解决方案来自:convert ms-access last() function to sql server 2008

但是,我收到以下错误消息:

Msg 1033, Level 15, State 1, Line 137
The ORDER BY clause is invalid in views, inline functions, derived tables, 
subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is 
also specified.

这很令人困惑,因为我已经在上面指定了 TOP。 有什么想法吗?

编辑: 此图显示了访问中使用的函数。

【问题讨论】:

  • 子查询中没有 TOP。这就是它所抱怨的。另外顺便说一句,您是否真的从 Access 中的 Last() 函数中获得了所需的结果。这是一个糟糕的功能,并没有像大多数人认为的那样做,应该删除恕我直言。
  • 不幸的是,在这种情况下,我是否得到正确的结果是无关紧要的。我已经参与了一个大规模的迁移项目,并且需要像迁移一样迁移到 SQL Server,因为如果我遗漏了任何东西,许多事情都会停止工作。不幸的是,这涉及到不得不使用可怕的 Last() 函数。
  • 没问题。谢天谢地,我认为 SQL Server 不够愚蠢,无法直接替换 Last()。建议的 Max() 将为您提供可重复的可靠结果。
  • 你在做什么,即使它有效,也只是给Max(),而不是Last()。不妨按照 Gustav 的建议使用 Max()

标签: sql-server tsql ms-access database-migration


【解决方案1】:

您不需要使用subquery,仅TOP 子句就足以访问[Delivery Table] 表的最后一条记录:

SELECT TOP (1) dt.[Advice Number]   
FROM [Delivery Table] AS dt
ORDER BY dt.[Advice Number] DESC;

但是,当您在子查询中指定 order by 子句时,您应该在 subquery 中包含 top 子句。

【讨论】:

  • 谢谢。这似乎在一定程度上起作用。我需要使用聚合数据,因此需要按上述查询进行分组。我必须使用 CTE/Temp 表来执行此操作吗?
  • @RikuDas。 . .你想达到什么目标?
  • 我试图模仿我在访问查询中得到的结果集。我不确定这个字段在哪里使用,如果有的话,以及用于什么。我主要担心的是,我们在 SQL 查询中得到的结果与我在访问对应项中得到的结果相同。我将使用带有传递查询的 Access 前端,所以我需要结果相同。
【解决方案2】:

您通常可以将 FirstLast 替换为另一个聚合函数,例如 MinMax -更多含义:

Max([Delivery Table].[Advice Number]) AS [LastOfAdvice Number]

【讨论】:

  • Max/Min 不会只给我最大/最小值吗?我需要 Last/First 值,而不是最大/最小。
  • 那么你必须定义“first”和“last”。问题是,当完成时 - 正如上面的@Minty 所述 - 函数 First() 和 Last() 可能会或可能不会返回预期结果,因此几乎无用。至少,Max() 将给出最高的“建议编号”,通常是最新的(最后记录的)。
  • 不幸的是,最大值并不总是最后一个值。主键 Advice Number 不是 Autonumber,而是 Number 字段。这些数字是在 VB 中生成 +1 的,并且有些数字已经过编辑,因此它们不是您期望的递增顺序。
  • 如果是这样,您为什么尝试使用ORDER BY [Delivery Table].[Advice Number]?但是 - 包括数据类型 DateTime 的时间戳字段并按(搜索)该字段排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多