UPDATE cdtable
SET cdcontent = 'cd is a good boy'
WHERE id IN (
SELECT * FROM ( -- ❌ 外層 SELECT * 導致回傳多欄位
SELECT * FROM cdtable
WHERE cdtype IN (1,2,3)
ORDER BY id DESC LIMIT 100
) AS cd
);
報錯:Operand should contain 1 column(操作元應包含 1 個欄位)。
WHERE id IN (...) 要求子查詢只回傳單一欄位(與 id 對應)。但最外層 SELECT * 將內層所有欄位(id, cdtype, cdcontent...)全選出來,導致欄位數不匹配。
UPDATE cdtable
SET cdcontent = 'cd is a good boy'
WHERE id IN (
SELECT id FROM ( -- ✅ 只選 id
SELECT * FROM cdtable
WHERE cdtype IN (1,2,3)
ORDER BY id DESC LIMIT 100
) AS cd
);
❌ 避免:SELECT * FROM (subquery) AS t
✅ 推薦:SELECT col1, col2 FROM (subquery) AS t
| 語句 | 子查詢需回傳 | 常見錯誤 |
|---|---|---|
WHERE col = (subquery) | 1 行 1 列 | 回傳多行或多列 |
WHERE (col1, col2) IN (subquery) | 多行 2 列 | 欄位數/順序不匹配 |
INSERT INTO t (a,b) SELECT ... | 目標欄位數一致 | SELECT * 導致欄位數多 |