为什么此代码不起作用?我得到这个错误
')'附近错误
在最后一行。我看不到我在哪里犯了语法错误(这是针对SQL Server 2017)。
DECLARE @NumRows INT;
SELECT @NumRows = COUNT(*) / 2
FROM SAMA;
SELECT MAX(NoMonths)
FROM
(SELECT TOP(@NumRows) NoMonths
FROM SAMA
ORDER BY NoMonths ASC)
查询要执行的操作是查找前N行中的最大行,并且N在变量中定义。
没有MAX
,子查询将工作并返回N行。但是当我添加时MAX
,它失败了。
您必须设置表别名:
DECLARE @NumRows INT;
SELECT @NumRows = COUNT(*) / 2 FROM SAMA;
SELECT MAX(NoMonths)
FROM (
SELECT TOP(@NumRows) NoMonths
FROM SAMA
ORDER BY NoMonths ASC
) table_alias
有用!令人难以置信的是,这将是我怀疑的最后一件事。更重要的是,即使不使用MAX(column)中的别名来引用该列,它也可以正常工作。我学得越多,似乎我永远也不会到达那里。非常感谢塞巴斯蒂安。
问它为什么要别名会太厚脸皮吗?并不是说还有另一个FROM可能引起混乱,如果我给它起一个名字,它有什么不同?我不认为必须为子查询提供别名,不是吗?
@Lana B这是一个很好的问题。在From子句中使用子查询时,SQL会将其视为表,因此需要一个名称。考虑一个电子表格,列和过滤器不一定要有名称,但工作表必须有名称。这很容易忘记(有时会令人讨厌),但是如果您以这种方式考虑,这是有道理的。
@ JJ32谢谢。我已经接受了这个建议,它肯定已经节省了我很多时间,不知道为什么会失败,但是知道为什么会有所帮助。我本周在stackoverflow上学到了很多东西,谢谢你们的时间。