在大多數程式語言中,程式碼依撰寫順序逐行執行;但 SQL 是宣告式語言,其邏輯處理順序與語法順序截然不同。理解這個順序是撰寫高效能查詢、正確使用別名、避免常見錯誤的關鍵。
步驟 10 返回的是游標,不符合關聯式表的定義(集合無序)。因此包含 ORDER BY 的查詢不可作為表運算式(視圖、內嵌函數、衍生表、子查詢、CTE),除非同時指定 TOP 或 FOR XML。錯誤範例:
-- 無效的衍生表
SELECT * FROM (SELECT orderid, customerid FROM orders ORDER BY orderid) AS d;
-- 無效的視圖
CREATE VIEW my_view AS SELECT * FROM orders ORDER BY orderid;
執行時會拋出錯誤 1033:「ORDER BY 子句在視圖、內嵌函數、衍生表、子查詢和 CTE 中無效,除非同時指定 TOP 或 FOR XML。」
TOP 100 PERCENT ... ORDER BY(SQL Server 允許)或移至外層查詢。將「學生-科目-分數」長表轉為寬表:
CREATE TABLE tb(姓名 VARCHAR(10), 課程 VARCHAR(10), 分數 INT);
INSERT INTO tb VALUES
('張三','語文',74),('張三','數學',83),('張三','物理',93),
('李四','語文',74),('李四','數學',84),('李四','物理',94);
SELECT 姓名,
MAX(CASE 課程 WHEN '語文' THEN 分數 ELSE 0 END) AS 語文,
MAX(CASE 課程 WHEN '數學' THEN 分數 ELSE 0 END) AS 數學,
MAX(CASE 課程 WHEN '物理' THEN 分數 ELSE 0 END) AS 物理
FROM tb
GROUP BY 姓名;
結果:
姓名 語文 數學 物理
李四 74 84 94
張三 74 83 93