【问题标题】:Sql top x order by [closed]Sql top x order by [关闭]
【发布时间】:2014-06-25 09:37:05
【问题描述】:

谁能帮我理解为什么它不起作用?

select top(10) * from
(select * from dbticket order by 1 desc ) a

错误是:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

我在第一列中有这个 ID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

我需要这样的id:

15
14
13
12
11..

【问题讨论】:

  • 在派生表之外使用该顺序。
  • 根据您的错误消息您的Subquery uses ORDER BY without specifying TOP within the subquery itself。 1 的顺序是什么?
  • 查看“除非”部分。所以你可以使用SELECT TOP(10) * FROM( SELECT TOP 100 PERCENT * FROM dbticket ORDER BY 1 DESC) a
  • @TimSchmelter - 你可以,但这只是消除警告并且可能实际上不会执行任何排序 - 所以你不妨说“你可以删除 ORDER BY 子句” - 它'将具有相同(保证)的效果。
  • 如果你能解释为什么你不只是使用select top(10) * from dbticket order by 1 desc,我们也许可以提供更多帮助

标签: sql sql-server sql-order-by


【解决方案1】:

由于基本的 T-SQL 逻辑,这不起作用。 T-SQL 是一个基于集合的理论,我们所说的 SET 是指 unordered 唯一的对象集合。所以FROM 关键字适用于Sets,但是当我们添加Order By 子句时,我们得到的不再是set,而是我们可以称之为CURSOR 或更具体的“当前行集” . 所以,这就解释了你的问题..一旦你添加了order by 1 descselect * from dbticket 返回的任何数据,即SET 都会转换为与FROM Clause 不兼容的Cursor

希望这会有所帮助!

要得到想要的结果,写成:

;with CTE as 
(
select row_number() over (order by id desc) as rownum, --order by the first column ex: id
name, id --select * columns 
from dbticket)
select Top 10 name , id from CTE --give names of all the columns you need
order by rownum asc;

查看示例代码here.

【讨论】:

  • 它按我的意愿运行,非常感谢
【解决方案2】:

你可以使用

SELECT TOP 10 * FROM dbticket ORDER BY 1 DESC

不需要子查询。

【讨论】:

  • 就是这样sql server先做“top 10”再做“orde by”子句
  • @RodolfoRollo - 请参阅“SELECT 语句的逻辑处理顺序”。 ORDER BY 是第 10 步。TOP 是第 11 步。
【解决方案3】:
select top(10) * from
(select * from dbticket order by 1 desc FOR XML AUTO) a

【讨论】:

  • 不起作用:消息 8155,级别 16,状态 2,第 2 行没有为“a”的第 1 列指定列名。即使这样做:select top(10) * from (select * from dbticket order by id_ticket desc FOR XML AUTO) a
  • 是的,根据查询我给出了答案,但我们需要给出列名
【解决方案4】:

试试这个

select * from
(select top(10)  * from dbticket order by 1 desc ) a

【讨论】:

  • 在你的解决方案中外子查询有什么用??
  • 我相信整个场景都没有给出 jst 需要的部分被质疑这是为所提出的问题提供的解决方案,可能你可以使用 where 条件或者它可能是什么。但是,如果您在内部或外部使用前 10 名,则没有区别。
【解决方案5】:

当您在子查询中有 order by 时,必须在选择查询时使用 Top 选项。您可以在查询中使用Top 100 Percent 以按选项从子查询中获取所有行。

例如:

select top(10) * from
(select top 100 Percent * from dbticket order by 1 desc ) a

在您的示例中,您可以使用以下查询:

select * from
(select top 10 * from dbticket order by 1 desc ) a

select top 10 * from dbticket order by 1 desc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多