如題,sql 報錯:Table is specified twice, both as a target for 'UPDATE' and as a separate source for data
。表被指定了兩次,同時作為 update 對象和獨立數據源。
報錯場景:查詢兩個表的差集並更新記錄。舉例說明:a、b 兩表聯查,找出 a 表中存在 b 表不存在的記錄,然后更新 a 表的某個字段做標記。
報錯 sql:
UPDATE company AS f SET related = 0 WHERE uid IN
(
select c.uid FROM company AS c
LEFT JOIN member AS m ON m.uid=c.uid
WHERE m.uid IS NULL
)
解決方法
既然一個表不能同時作為 update 對象和獨立數據源,那就改變其中一個。update 為主句,不可能去掉,那就只能修改作為數據源部分的表。將兩表聯查的結果作為一個臨時表,在外層在加一層查詢。這樣數據源變成了臨時表,而非之前聯查的兩個表。
UPDATE company AS f SET related = 0 WHERE uid IN (
SELECT * FROM
(
select c.uid FROM company AS c
LEFT JOIN member AS m ON m.uid=c.uid
WHERE m.uid IS NULL
) AS d
)