🎯 這兩天改 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
得到正確結果:
參考
最后:提前祝大家假期快樂 🎉🎉🎉