【问题标题】:Invalid query syntax [closed]无效的查询语法 [关闭]
【发布时间】:2014-08-12 19:23:46
【问题描述】:

我有一个这样的查询:SELECT TOP 20 a.Job_No FROM dbo.ScheduledatesFF 它给了我前 20 个结果,但我想从 20 开始得到 20 个结果,如何设置偏移量?

我试过:OFFSET 20 在查询结束时出现了这个错误:

Incorrect syntax near 'OFFSET'

我在mysql中知道它的Offset,在SQL中有什么不同吗?

这给了我一个错误:

SELECT 
    a.Job_No 
FROM (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY a.Job_No) as RowNum 
    FROM dbo.ScheduledatesFF 
    FROM dbo.ScheduledatesFF AS a 
    INNER JOIN dbo.tblCustomers AS c 
        ON a.Job_No = c.Job_No 
    INNER JOIN dbo.scheduledatesSS AS z 
        ON a.Job_No = z.Job_No 
    LEFT OUTER JOIN dbo.maxscheddate AS m 
        ON a.Job_No = m.Job_No
        ) AS MyDerivedTable 
WHERE MyDerivedTable.RowNum BETWEEN 0 AND 20

Incorrect syntax near the keyword 'FROM'.

这是我最近的一次:

SELECT a.Job_No, ROW_NUMBER() OVER (ORDER BY a.Job_No) as datacounter FROM dbo.ScheduledatesFF AS a INNER JOIN dbo.tblCustomers AS c ON a.Job_No = c.Job_No INNER JOIN dbo.scheduledatesSS AS z ON a.Job_No = z.Job_No LEFT OUTER JOIN dbo.maxscheddate AS m ON a.Job_No = m.Job_No

但是在 datacounter 的 where 子句中它说它不存在

【问题讨论】:

  • 你看the documentation了吗?您运行的是 SQL Server 2012 还是更高版本?
  • 这个问题似乎是题外话,因为这涵盖了虚构的语法
  • 也许尝试从更简单的开始。现在,您拥有 FROM dbo.ScheduledatesFF FROM dbo.ScheduledatesFF,无论您尝试使用哪种分页语法,它都会失败。
  • 您可能会考虑为您的 SQL 代码确定一种您可以接受的格式,然后一致地应用它。您可以从那些编辑过您的问题的人中观察到,它几乎无法解析,更不用说在滚动几页时理解问题了。
  • @AaronBertrand MySQL 可以选择带有 OFFSET 的 LIMIT 语法。 LIMIT row_count(0 偏移)或LIMIT offset, row_countLIMIT row_count OFFSET offset

标签: sql sql-server


【解决方案1】:

查看您发布的问题的代码很简单。你有两个“FROM dbo.ScheduledatesFF

看。

SELECT 
    MyDerivedTable.Job_No 
FROM (
    SELECT 
        a.Jon_No,
        ROW_NUMBER() OVER (ORDER BY a.Job_No) as RowNum 
    FROM dbo.ScheduledatesFF --<--What's up with this guy here?
    FROM dbo.ScheduledatesFF AS a 
    INNER JOIN dbo.tblCustomers AS c 
        ON a.Job_No = c.Job_No 
    INNER JOIN dbo.scheduledatesSS AS z 
        ON a.Job_No = z.Job_No 
    LEFT OUTER JOIN dbo.maxscheddate AS m 
        ON a.Job_No = m.Job_No
        ) AS MyDerivedTable 
WHERE MyDerivedTable.RowNum BETWEEN 0 AND 20

仍然认为下面的解决方案更好,但这就是您遇到语法错误的原因。

【讨论】:

  • 删除多余的,给我一个新的错误“a.Job_No”无法绑定。状态 1,第 1 行
  • @user3922763 jeezus,将您的外部SELECT 更改为SELECT MyDerivedTable.Job_No 并尝试阅读错误消息以调试您的代码
  • @user3922763 请去code golf 什么的。你需要自己做一些调试。
  • 你删除了我假设的那个。
  • @Zane 问题出在外部SELECT
【解决方案2】:

看这里:Row Offset in SQL Server 看起来好像没有直接等效的关键字,但是通过一些变通方法仍然可以达到相同的效果。

SELECT Job_No
FROM (
SELECT Job_No, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
FROM MyTable
) AS MyDerivedTable
WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow

@startRow@endRow 替换为您的起始行号和结束行号。

更新:基于问题中的更新信息:

 SELECT 
 Job_No 
 FROM (
 SELECT 
 ROW_NUMBER() OVER (ORDER BY a.Job_No) as RowNum 
 FROM dbo.ScheduledatesFF AS a 
 INNER JOIN dbo.tblCustomers AS c 
 ON a.Job_No = c.Job_No 
 INNER JOIN dbo.scheduledatesSS AS z 
 ON a.Job_No = z.Job_No 
 LEFT OUTER JOIN dbo.maxscheddate AS m 
 ON a.Job_No = m.Job_No
 ) AS MyDerivedTable 
 WHERE MyDerivedTable.RowNum BETWEEN 0 AND 20

无论如何,这是我最好的猜测。看起来你有 2 个 from 语句背靠背....

【讨论】:

  • 我不懂那个语法
  • SQL Server 2012 或更高版本has much better syntax
  • 没错,我想要一个更安全的解决方案,因为没有说明使用的版本......@user3922763 回答更新了一些以进行澄清。
  • 还有其他方法可以解决这个问题吗?
  • 为了可读性而缩进也不大,我接受。无论如何,您的代码仍然有错误 - 外部列查找 a.Job_No 但派生表不称为 a。通常设置一个SQL fiddle 可以防止这些由未经测试的代码引起的错误。
猜你喜欢
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多