SQL Server 子查询无法使用 ORDER BY?
🎯 这两天改 Bug 时使用 Sql Server 的子查询遇到了一些问题,特此记录一下,之前用 MySQL 比较多,按照 MySQL 的语法其实是没有问题的。
以下面这张表为例:
执行以下 SQL:
select * from (
select * from t_book order by number
) ttt
会报出下面的错误:
> Msg 1033, Level 15, State 1, Server WIN-IOR47PKR2AD, Procedure , Line 0
除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
> [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。 (1033)
经过一番折腾,找到解决方案:select
后面加上 top 100 percent
select * from (
select top 100 percent * from t_book order by number
) ttt
运行结果如下,看似成功运行了,但 order by 并没有生效!!!
于是乎,又是一番折腾,改动 SQL:
/*
一般来说,如果数据库不回超过1亿条数据,使用99.999999 PERCENT不会使你遗漏数据。需要的话再添俩9
*/
select * from (
select top 99.999999 percent * from t_book order by number
) ttt
得到正确结果:
参考
最后:提前祝大家假期快乐 🎉🎉🎉