首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 派生表 (Derived Table) 實戰:替代 VIEW、實現行列轉換、多表橫向合併

     編輯:關於SqlServer

什麼是派生表?

FROM 子句中的子查詢,必須有別名,行為如臨時 View,僅在該查詢存續期間存在。無需建立物件、無權限問題、自動清理。

案例 1:替代 View 簡化多表聯結


SELECT RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname) AS Name, d1.title_id
FROM authors a, 
     (SELECT title_id, au_id FROM titleauthor) AS d1  -- 派生表
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname;

案例 2:行列轉換 (多欄位橫向展開) — 三種寫法比較

需求:同一日期下,不同 id (1/2/3) 的價格橫向顯示

寫法 A:相關子查詢 (較慢,逐列執行)


SELECT DISTINCT ww.dates,
    (SELECT price FROM adt1 b WHERE id=1 AND ww.dates=b.dates) AS w1,
    (SELECT price FROM adt1 c WHERE id=2 AND ww.dates=c.dates) AS w2,
    (SELECT price FROM adt1 d WHERE id=3 AND ww.dates=d.dates) AS w3
FROM adt1 ww
ORDER BY ww.dates;

寫法 B:三個派生表 INNER JOIN (推薦,集合運算)


SELECT a.dates, a.price AS w1, b.price AS w2, c.price AS w3
FROM (SELECT * FROM adt1 WHERE id=1) AS a
JOIN (SELECT * FROM adt1 WHERE id=2) AS b ON a.dates = b.dates
JOIN (SELECT * FROM adt1 WHERE id=3) AS c ON b.dates = c.dates
ORDER BY a.dates;
  • 各派生表先篩選單一 id,資料量大幅縮減
  • JOIN 於 dates,利用索引極快
  • 若日期不全齊,改用 LEFT JOIN 保留基準表

進階:動態欄位數量

若 id 值不固定,需動態 SQL 組裝 PIVOT 或多重 LEFT JOIN,派生表結構相同,僅在應用層組裝 SQL 字串。


派生表是 T-SQL 靈活度最高的結構之一:**零物件開銷、語意封裝、最佳化器可下推述詞**。善用它替代 View、簡化複雜邏輯、實現橫向合併,讓查詢既清晰又高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved