【问题标题】:Function Limit in SQL is not working correctlySQL 中的函数限制无法正常工作
【发布时间】:2021-02-04 06:18:01
【问题描述】:

我正在尝试从用户那里获取最新条目,并且我正在使用以下语句:

    SELECT [username]
      ,[Name]
      ,[Surname]
      ,[Email]
      ,[Phone]
      ,[Mobile]
,[Query]

  FROM [ECom].[dbo].[Queries]
  ORDER BY [ECom].[dbo].[Queries].[username] DESC LIMIT 1

我收到以下错误:

消息 102,级别 15,状态 1,第 12 行 'LIMIT' 附近的语法不正确。

PS:我也在尝试这种方式,但错误不断弹出:

 SELECT [username]
      ,[Name]
      ,[Surname]
      ,[Email]
      ,[Phone]
      ,[Mobile]
,[Query]

  FROM [ECom].[dbo].[Queries]
  ORDER BY [username] DESC LIMIT 1

【问题讨论】:

  • 代码是sqlserver,它有TOP而不是limit。 (错误信息也是sqlserver)

标签: sql sql-server greatest-n-per-group


【解决方案1】:

您的错误消息表明您正在运行 SQL Server,在标识符周围使用方括号也是如此。

limit 不是 SQL Server 中的东西。相反,请使用top:

SELECT TOP (1) [username]
     ,[Name]
     ,[Surname]
     ,[Email]
     ,[Phone]
     ,[Mobile]
     ,[Query]
FROM [ECom].[dbo].[Queries]
ORDER BY [username] DESC 

从 SQL Server 2012 开始,您可以使用 fetch 子句,这是标准的 ANSI SQL(虽然它没有在 MySQL 中实现...):

SELECT [username]
     ,[Name]
     ,[Surname]
     ,[Email]
     ,[Phone]
     ,[Mobile]
     ,[Query]
FROM [ECom].[dbo].[Queries]
ORDER BY [username] DESC
OFFSET 0 ROWS FETCH FIRST 1 ROW 

如果您想要每个用户的最后一条记录,那么这是一个不同的问题。一种选择使用窗口函数:

select *
from (
    select q.*, row_number over(partition by username order by ?? desc) rn 
    from ecom.dbo.queries q
) q
where rn = 1

?? 应替换为定义每个用户的行顺序的列的名称。

您也可以使用fetch 中的top 执行此操作 - 但您需要将窗口函数放在order by 子句中:

select top (1) with ties q.*
from ecom.dbo.queries q
order by row_number over(partition by username order by ?? desc) rn 

【讨论】:

  • 但这只显示我一条记录,我想显示每个用户的最后一条记录
  • @Burdy:这在你原来的问题中根本不清楚......应该使用哪一列来对每个用户的记录进行排序?
  • 很抱歉,必须使用的列是用户名,因为我想从每个用户名中获取最新的查询
  • @Burdy。编辑后的答案就是这样做的。如前所述,您只需选择正确的列来对记录进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2017-12-15
  • 2013-03-27
  • 2012-08-15
  • 2013-11-05
相关资源
最近更新 更多