题目要求:
我第一次写的:
我第二次改的:(加了个TOP(100))
但是最后结果还是升序!
参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。
针对你所描述的问题,创建一个视图以展示每位读者的借书证号、姓名以及他们借阅图书的数量,并且要求这个结果集按照借书证号降序排列。然而,SQL Server 视图中的 ORDER BY
子句是无效的,除非与 TOP
, OFFSET
, 或 FOR XML
结合使用。你已经尝试了添加 TOP(100) PERCENT
,但这似乎没有解决你的排序问题。
解决这个问题的关键在于,虽然你可以在视图定义中包括 ORDER BY
和 TOP
,但这样做并不会影响视图本身的数据存储方式。视图不会存储数据,它只是一个查询的封装,因此,当从视图中选择数据时,你仍然需要在最终的查询中使用 ORDER BY
来获取期望的排序结果。
以下是修改后的视图定义,它将保留你当前的逻辑,但在最终使用视图时,你需要额外的 SELECT
查询来应用 ORDER BY
:
CREATE VIEW num_borrow AS
SELECT
Borrowing.借书证号,
Readers.姓名,
COUNT(Borrowing.借书证号) AS '借阅图书的数量'
FROM
Readers
INNER JOIN
Borrowing ON Readers.借书证号 = Borrowing.借书证号
GROUP BY
Borrowing.借书证号,
Readers.姓名;
然后,在使用视图时,执行下面的查询:
SELECT
*
FROM
num_borrow
ORDER BY
借书证号 DESC;
这将确保结果按借书证号降序排列。注意,这里使用了 INNER JOIN
而不是逗号连接,这通常提供更清晰的语义并且在某些情况下可能提供更好的性能。
如果你需要在视图定义中包含排序行为(例如,为了简化最终用户或应用程序的查询),可以考虑创建一个带有 TOP
的视图,并在应用程序或最终用户的查询中使用 OFFSET
和 FETCH
子句来实现分页和排序。然而,这通常不推荐作为常规实践,因为视图的目的主要是为了封装复杂性而不是存储排序的数据。