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。
答案 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
祝福, 詹姆斯