0

我的 vba 项目中有一个无法解决的小 sql 问题。我有一张表,除了他的 ID 外,还有另一个唯一的参考。此列名为“Ref_Q”,为文本:“13/45”。今年有 13 个,还有另一个独特的数字。现在我不想从我的桌子上得到最大的 Ref_Q。首先我得到了这个:

SELECT * FROM Reports WHERE Ref_Q = (SELECT MAX(Ref_Q) FROM Reports);

一切都很顺利,直到我的 Ref_Q 大于 99。所以我有“13/102”,而他总是选择 Ref_Q“13/99”。所以我尝试了这样的事情:

SELECT CAST(SUBSTRING(MAX(Ref_Q),4) AS Int) FROM Reports

但现在我不断收到错误:

Syntax error (missing operator) in query expression 'CAST(SUBSTRING(MAX(Ref_Q),4) AS Int)'
4

1 回答 1

1

试试这个查询(使用 SQL Server 语法):

SELECT *
FROM Reports
WHERE Ref_Q = (SELECT top 1 Ref_Q
               FROM Reports r
               ORDER BY left(Ref_Q, 2) desc,
                        cast(substring(Ref_Q, 4, len(Ref_Q) - 3) as int) desc
              );

这使用order by而不是max()根据您的规则获取最大值。顺便说一句,您可以通过使用 '13\0102'和对数字进行零填充来解决此问题'13\0099'

顺便说一句,如果你只想要行,你可以使用子查询:

               SELECT top 1 *
               FROM Reports r
               ORDER BY left(Ref_Q, 2) desc,
                        cast(substring(Ref_Q, 4, len(Ref_Q) - 3) as int) desc

编辑:

是一个 SQL Fiddle,展示了它们的运行情况。

现在我看到它被标记为访问。哎呀。我认为这可能有效:

SELECT *
FROM Reports
WHERE Ref_Q = (SELECT top 1 Ref_Q
               FROM Reports r
               ORDER BY left(Ref_Q, 2) desc,
                        cint(mid(Ref_Q, 4, len(Ref_Q) - 3)) desc
              );

(但是,我确实注意到,cast()据我所知,您的原始查询使用的不在 Access 中。)

于 2013-09-12T11:53:05.690 回答