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

SQL Server 多列求單行最大/最小值:CASE 巢狀 vs UNION ALL 兩種模式對比

     編輯:關於SqlServer

業務需求

表 table1 有四個 INT 列 F1~F4,需按行返回四列中的最大值(及對應列名)。

方法一:CASE 表達式巢狀(單掃描,無排序開銷)

SELECT 
    CASE 
        WHEN F12 > F34 THEN F12 
        ELSE F34 
    END AS MaxNum
FROM (
    SELECT 
        CASE WHEN F1 > F2 THEN F1 ELSE F2 END AS F12,
        CASE WHEN F3 > F4 THEN F3 ELSE F4 END AS F34
    FROM table1
) AS t1
ORDER BY MaxNum DESC;

優點:單次掃描、無額外排序、適合大數據量。
缺點:代碼隨列數增長呈指數級複雜,難維護。

方法二:UNION ALL 縱向轉橫 + TOP 1(可擴展,自帶列名)

SELECT TOP 1 *
FROM (
    SELECT F1 AS MaxNum, 'F1' AS ColumnName FROM table1
    UNION ALL SELECT F2, 'F2' FROM table1
    UNION ALL SELECT F3, 'F3' FROM table1
    UNION ALL SELECT F4, 'F4' FROM table1
) AS T
ORDER BY T.MaxNum DESC;

優點:結構清晰、易擴展列、自帶來源列名。
缺點:掃描表 4 次、需排序、大表性能較差。

UNION vs UNION ALL 關鍵差異

特性UNIONUNION ALL
去重是(排序/哈希去重)否(直接合併)
性能較慢快
適用場景需唯一結果集允許重複/已知無重複

本場景必須用 UNION ALL,否則同值不同列會被錯誤去重。

性能建議

  • 列數固定 ≤ 5、大表 → 推薦方法一
  • 列數動態/需列名/中小表 → 推薦方法二
  • SQL 2008+ 可用 CROSS APPLY (VALUES ...) 寫法更優雅(見擴展)

擴展:VALUES 行構造器寫法 (SQL 2008+)

SELECT TOP 1 v.MaxNum, v.ColumnName
FROM table1
CROSS APPLY (VALUES 
    (F1, 'F1'), (F2, 'F2'), (F3, 'F3'), (F4, 'F4')
) AS v(MaxNum, ColumnName)
ORDER BY v.MaxNum DESC;

方法一結果 方法二結果

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