MySQL 錯誤:表指定兩次
當嘗試更新表並將其用作資料來源時,MySQL 可能會發出錯誤表明該表被指定了兩次。這通常發生在使用帶有表別名的子查詢時。
例如,考慮以下查詢:
UPDATE manager AS m1 SET m1.status = 'Y' WHERE m1.branch_id IN ( SELECT m2.branch_id FROM manager AS m2 WHERE (m2.branch_id, m2.year) IN ( SELECT DISTINCT branch_id, year FROM branch_master WHERE type = 'finance' ) );
此查詢嘗試根據檢查某些欄位是否存在的子查詢來更新管理員表在manager 中,符合類型為「finance」的branch_master 表中的值。然而,MySQL 反對管理器表既用作目標(在 UPDATE 子句中)又用作資料來源(在子查詢中)。
要解決此問題並防止「表被指定兩次」錯誤,我們可以為子查詢使用派生表。這涉及到基於原始表創建一個臨時表,然後從該派生表中進行選擇:
FROM (SELECT * FROM manager) AS m2
通過將原始管理器表括在括號中並將結果別名為m2,我們創建了一個新的派生表。這允許我們從管理器表中選擇數據,而無需兩次明確指定管理器名稱。
更新的查詢:
UPDATE manager SET status = 'Y' WHERE branch_id IN ( SELECT branch_id FROM (SELECT * FROM manager) AS m2 WHERE (m2.branch_id, m2.year) IN ( SELECT branch_id, year FROM branch_master WHERE type = 'finance' ) );
此更新的查詢正確使用派生表作為子查詢,解決了「表被指定兩次」錯誤並允許查詢成功執行。
以上是如何解決MySQL使用子查詢時出現「Table Specified Twice」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!