表 table1 有四個 INT 列 F1~F4,需按行返回四列中的最大值(及對應列名)。
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;
優點:單次掃描、無額外排序、適合大數據量。
缺點:代碼隨列數增長呈指數級複雜,難維護。
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 | UNION ALL |
|---|---|---|
| 去重 | 是(排序/哈希去重) | 否(直接合併) |
| 性能 | 較慢 | 快 |
| 適用場景 | 需唯一結果集 | 允許重複/已知無重複 |
本場景必須用 UNION ALL,否則同值不同列會被錯誤去重。
CROSS APPLY (VALUES ...) 寫法更優雅(見擴展)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;
