需求:從表隨機抽取 5 筆 type=1 與 5 筆 type=0,合併輸出。直覺寫法:
SELECT TOP 5 * FROM xxx WHERE type=1 ORDER BY NEWID()
UNION
SELECT TOP 5 * FROM xxx WHERE type=0 ORDER BY NEWID();
-- Msg 156: Incorrect syntax near the keyword 'ORDER'.
UNION 作業會合併結果集並排序去重,ORDER BY 只能放在最外層 (最終結果),不能放在各子查詢內 (除非搭配 TOP 或 FOR XML)。
TOP ... ORDER BY 在子查詢):SELECT * FROM (
SELECT TOP 5 * FROM xxx WHERE type=1 ORDER BY NEWID()
) t1
UNION
SELECT * FROM (
SELECT TOP 5 * FROM xxx WHERE type=0 ORDER BY NEWID()
) t2;
SELECT * FROM (
SELECT TOP 5 * FROM xxx WHERE type=1 ORDER BY NEWID()
) t1
UNION ALL
SELECT * FROM (
SELECT TOP 5 * FROM xxx WHERE type=0 ORDER BY NEWID()
) t2;
-- 若需最終隨機順序,再包一層 ORDER BY NEWID()
WITH Ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY type ORDER BY NEWID()) AS rn
FROM xxx
WHERE type IN (0,1)
)
SELECT * FROM Ranked WHERE rn <= 5;
ORDER BY 僅允許在 TOP/OFFSET-FETCH 子查詢或最外層。UNION ALL 優於 UNION (除非需去重)。ROW_NUMBER() 為現代標準寫法,單掃描、可讀性佳。