我的问题有点类似于SQL Delete Rows Based on Another Table
除了4列匹配的情况下两个条目匹配的事实!
所以,我有:
表1:
Field | Type | Null | Key | Default | Extra
f1 | int(32) unsigned | NO | PRI | NULL | auto_increment
f2 | int(32) | NO | | 0 |
f3 | int(32) | NO | | 0 |
f4 | int(32) | NO | | 0 |
和另一个表f1,f2,f3,f4 +其他字段。 我想删除表1中基于
在表2中具有对应关系的任何记录T1.f1=T2.f1 and T1.f2=T2.f2 and T1.f3=T2.f3 and T1.f4=T2.f4
最有效的方法是什么?我虽然检索了一个程序中的所有T1记录然后在T2上进行了n次选择,但是每次在T1中平均有5k条记录,我觉得这不是最有效的方式......
修改 由于有很多记录,我只是在T2上,在一个单独的字段上创建了一个索引(比如说字段1为了参数')
答案 0 :(得分:3)
如果要删除的行太多,那么您还可以执行 CTAS ,即 create table as select
。从12c
开始,CTAS不需要收集统计信息。
CTAS 会比 DELETE 快得多。
例如,
第1步
CREATE TABLE t_new AS
SELECT t1.col1,
t1.col2,
t1.col3,
t1.col4
FROM t1,
t2
WHERE t1.col1 <> t2.col1
AND t1.col2 <> t2.col2
AND t1.col3 <> t2.col3
AND t1.col4 <> t2.col4;
第2步
CREATE INDEX indx_name ON t_new(COLUMN_NAME)
第3步
DROP TABLE t1 PURGE;
第4步
ALTER TABLE t_new RENAME TO t1;
答案 1 :(得分:2)
您可以使用EXISTS
:
DELETE FROM Table1 t1
WHERE EXISTS
(
SELECT 1 FROM Table2 t2
WHERE T1.f1=T2.f1 AND T1.f2=T2.f2 AND T1.f3=T2.f3 AND T1.f4=T2.f4
)
最有效的方法取决于您的rdbms和使用的索引。
答案 2 :(得分:2)
使用删除加入:
DELETE t1
FROM t1
JOIN t2 ON T1.f1=T2.f1
AND T1.f2=T2.f2
AND T1.f3=T2.f3
AND T1.f4=T2.f4
作为正确的连接,此语法通常会产生最佳性能。 T2中一列(或多列)的索引将有所帮助。