首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 子查詢「選擇列表中只能指定一個表達式」錯誤原因與修正

     編輯:程式設計綜合問答

錯誤 SQL

SELECT TOP 10 * FROM T_User 
WHERE ID NOT IN (SELECT TOP 0 * FROM T_User ORDER BY ID ASC)

錯誤原因

NOT IN 子查詢必須返回單列,但 SELECT TOP 0 * 返回所有列(或零列),導致「當沒有用 EXISTS 引入子查詢時,在選擇列表中只能指定一個表達式」。

修正寫法

-- 正確:子查詢只選 ID 列
SELECT TOP 10 * FROM T_User 
WHERE ID NOT IN (SELECT TOP 20 ID FROM T_User ORDER BY ID ASC)

-- 更推薦:使用 NOT EXISTS 避免 NULL 值陷阱
SELECT TOP 10 * FROM T_User u1
WHERE NOT EXISTS (SELECT 1 FROM T_User u2 WHERE u2.ID = u1.ID ORDER BY u2.ID ASC OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY)

最佳實踐

  • 子查詢配合 IN / NOT IN 時,必須只選擇一列,且該列類型與外層匹配。
  • 優先使用 EXISTS / NOT EXISTS,性能更好且語義清晰,不受 NULL 影響。
  • TOP 0 無實際意義,可能是調試殘留,應刪除或改為具體行數。

擴展:分頁查詢標準寫法 (SQL Server 2012+)

SELECT * FROM T_User
ORDER BY ID
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved