在子查询内部排序

时间:2011-07-20 18:14:24

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

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。

4 个答案:

答案 0 :(得分:7)

这里有两个问题。

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

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

答案 1 :(得分:6)

你做不到。只有最外面的 ORDER BY很重要。

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

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

答案 2 :(得分:1)

子查询中无需使用ORDER BY

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

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

答案 3 :(得分:0)

我与先前的答案分享了这样的观点,即在子查询中执行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

祝福, 詹姆斯