【问题标题】:Order by inside a subquery在子查询中排序
【发布时间】:2011-07-20 18:14:23
【问题描述】:
SELECT u.id
FROM user u
WHERE u.id IN 
((SELECT l.id FROM location l WHERE l.id = ?id ORDER BY l.idLocation DESC )) 

我想要做的是让这个 Order By 工作。但是不可能在视图中进行排序。如果不在视图内,我该如何执行此命令?

SQL 响应:

Msg 1033, Level 15, State 1, Line 5 ORDER BY 子句在 视图、内联函数、派生表、子查询和公用表 表达式,除非还指定了 TOP 或 FOR XML。

【问题讨论】:

  • 你的意思是子查询吗?我在这里看不到风景。
  • 我看不出使ORDER BY 工作对输出有何影响。你能给我们举个例子说明你现在得到的输出,以及你希望它有什么不同吗?在 IN 声明中,ORDER BY 即使“有效”也不太重要,因此您会得到一些令人困惑的答案。
  • +1 @ChrisCunningham - OP,从原始查询中不清楚您希望结果的顺序,因为您只是检查 u.id 是否在子选择的结果中。

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


【解决方案1】:

这里有两个问题。

1 - 您的ORDER BY 毫无意义。当您使用IN 子查询时,ORDER 无关紧要。

2 - 视图的ORDER BY 应该在调用查询中,而不是在视图本身中。

【讨论】:

    【解决方案2】:

    你不能。只有最外层 ORDER BY 很重要。

    所以SELECT * FROM MyView ORDER By Whatever唯一的方式。

    任何中间顺序(无论是 ORDER BY 还是巧合,还是局域网的一部分)都被忽略

    【讨论】:

    • 谢谢。可怜我,那我得另找办法了。
    • @pringlesinn - 做什么? - 这是目前最大的谜。
    • 如果我有一个文章表,我需要按 A-Z 或 Z-A 顺序显示它们,但我也想一次选择 100 个。 ORDER BY 外部仅订购选定的 100 个。如何为所有人执行此操作?
    • 这是不正确的。许多情况都受益于内部ORDER BY。分页查询是一个常见的例子。子查询中的排序获取在表范围内排序的行。最外层的 ORDER BY 订单只在最终结果的范围内。
    【解决方案3】:

    我与之前的答案一样认为在子查询中执行order by 通常不是一个好主意。但是,我发现这样做有时非常有用。我假设 pringlesinn 的问题中的示例查询是更复杂要求的一个简单示例。您可以通过这种方式在子查询中执行order by

    SELECT u.id
    FROM user u
    WHERE exists
    (SELECT ROW_NUMBER() OVER (ORDER BY l.idLocation DESC) FROM location l WHERE u.id = l.id and l.id = ?id) 
    

    但是您会注意到 WHERE 子句不再使用“IN”运算符。相反,您必须使用“EXISTS”并执行相关的子查询。或者你可以这样做:

    SELECT u.id
    FROM user u inner join 
      (
        SELECT ROW_NUMBER() OVER (ORDER BY l.idLocation DESC) as rowid, l.id 
        FROM location l 
        WHERE l.id = ?id
      ) as z on z.id = u.id
    

    最好的祝愿, 詹姆斯

    【讨论】:

    • gbn 所述,order by 在内部查询中被忽略。我检查了这两个代码 sn-ps 的执行计划,order by 似乎被消除了。然而,我确实记得在更复杂的情况下使用上述方法是完成任务的最佳方式。祝你好运!
    【解决方案4】:

    在子查询中不需要使用ORDER BY

    如果您想在视图中添加ORDER BY,您可以在视图中添加TOP(100) PERCENT,然后您就可以使用它了。

    http://cf-bill.blogspot.com/2007/01/sql-server-order-view.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多