我正在尝试查找第一个唯一值 TaxGroupCode 的第一个 SeqGrp 和 SeqNum。我在 MSACCESS 查询中使用了此查询(如下所示),但我们最近开始使用 SQL 2008。然而,似乎“FIRST”在 SQL 中不是一个有效的函数(至少在这个版本中)。
SELECT DISTINCT First(DesotoCoPA_Trims.SeqGrp) & "-" & First (DesotoCoPA_Trims.SeqNum), "Tax District " & DesotoCoPA_Trims.TaxGroupCode As Sample
FROM DesotoCoPA_Trims
GROUP BY DesotoCoPA_Trims.TaxGroupCode;
这会产生:
GrpSeq Sample
2-28 Tax District 2
5-31 Tax District 3
6-2123 Tax District 7
6-2128 Tax District 1
6-9694 Tax District 6
我对 SQL 比较陌生,所以我不知道如何解决这个问题。我不需要专门以这种方式格式化结果。
您需要获取较新版本的 SQL Server。
原因之一是 SQL Server 2008 已经完全过时了。它已经超过 5 年没有任何补丁或更新了……甚至没有关键的安全更新。继续使用它是危险且不负责任的。我知道您可能无法直接进行此更改,但您可能能够将这种需求(不想要!)推向链条。
但另一个原因是新版本的 SQL Server 可以让你轻松解决这个问题。
为了理解其中的原理,首先我需要解释一下关系集合论。真正的关系数据库对于集合中的第一项或最后一项没有“任何概念”。如果没有明确的 ORDER BY
指令,他们可以自由地以他们认为方便的任何顺序返回行。这通常会与存储在磁盘上或主键中的顺序匹配,但是对于给定的查询运行,有很多事情可以改变这一点。数据库可以从
相同的 sql对相同的数据给出不同的结果。 这样不好。
Access 的
First()
功能违反了这一原则,因此从未被添加到最重要的数据库产品中。
较新版本的 SQL Server 有一种称为“窗口函数”的功能,其中一个是。此函数是 ANSI 标准的一部分,并使用
OVER
子句,您将在其中包含 ORDER BY
定义,以便获得确定性结果。此功能在 SQL Server 2008 中尚不可用。
好消息是,任何足够小以适合 MS Access 的数据库也可能很容易满足当前 SQL Server 版本的
freeExpress 版本的限制。如果由于操作系统太旧而无法安装,这也是一个严重问题。