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。
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
);
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;
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 後子查詢只能單列。IN 中返回多列。