我有一张桌子,我想用另一张桌子更新,所以我有类似的东西:
UPDATE table1 JOIN table2 ON table1.id = table2.fk_table1 SET table1.field1 = table2.field1
但我也希望将此表中所有不属于此UPDATE的行减少为:
DELETE FROM table1 WHERE id not IN (UPDATE ...)
他们是一种在一个优化sql请求中执行此操作的方法,或者我必须在两个请求中执行此操作?
由于
答案 0 :(得分:1)
您必须在两个请求中执行此操作,因为它们是两个不同的操作DML操作:
首先触发更新声明:
Convert
然后通过在select:
中转换update来触发删除请求UPDATE table1 JOIN table2 ON table1.id = table2.fk_table1 SET table1.field1 = table2.field1
注意:在update命令中使用select with same condition来获取在第一个语句中更新的记录列表。
答案 1 :(得分:1)
您可以使用以下查询 -
DELETE FROM tbl1.* FROM
table1 AS tbl1
LEFT JOIN table2 AS tbl2 ON table1.id = table2.fk_table1
WHERE tbl2.id IS NULL
但是根据表大小和创建锁定会很慢,所以你应该首先从table1获取所有id,然后删除它们。
SELECT tbl1.id FROM
table1 AS tbl1
LEFT JOIN table2 AS tbl2 ON table1.id = table2.fk_table1
WHERE tbl2.id IS NULL
现在删除这些ID,根据记录编号放入子句或多个块。
DELETE FROM table1 WHERE id IN ();