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

SQL IN 子查詢報錯 "too many values":子查詢返回多列導致

     編輯:程式設計綜合問答

錯誤 SQL

SELECT USER_ID, USER_GRD_ID FROM CUST_GRD
WHERE USER_ID IN (
    SELECT EUSER_ID, MAX(START_DATE)  -- 錯誤:返回兩列
    FROM CUST_GRD
    GROUP BY USER_ID
)

錯誤原因

IN 子查詢**必須返回單列**,用於與外層 USER_ID 比較。子查詢選了 EUSER_ID 和 MAX(START_DATE) 兩列,導致「too many values」。

正確邏輯:分組取最大日期對應的行

需求:每個 USER_ID 取 START_DATE 最大的那條記錄的 USER_GRD_ID。

方案一:關聯子查詢 (標準 SQL)

SELECT t1.USER_ID, t1.USER_GRD_ID
FROM CUST_GRD t1
WHERE t1.START_DATE = (
    SELECT MAX(t2.START_DATE)
    FROM CUST_GRD t2
    WHERE t2.USER_ID = t1.USER_ID
);

方案二:ROW_NUMBER() 窗口函數 (Oracle/SQL Server/PostgreSQL)

WITH ranked AS (
    SELECT USER_ID, USER_GRD_ID,
           ROW_NUMBER() OVER (PARTITION BY USER_ID ORDER BY START_DATE DESC) AS rn
    FROM CUST_GRD
)
SELECT USER_ID, USER_GRD_ID FROM ranked WHERE rn = 1;

方案三:JOIN 衍生表 (MySQL 8.0+ / 其他)

SELECT t1.USER_ID, t1.USER_GRD_ID
FROM CUST_GRD t1
JOIN (
    SELECT USER_ID, MAX(START_DATE) AS max_dt
    FROM CUST_GRD
    GROUP BY USER_ID
) t2 ON t1.USER_ID = t2.USER_ID AND t1.START_DATE = t2.max_dt;

總結

  • IN 後子查詢只能單列。
  • 「每組取最值對應行」用關聯子查詢、窗口函數或 JOIN 衍生表,不可直接在 IN 中返回多列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved