如果该条目已存在于表B中,则从表A中删除条目

时间:2015-06-03 10:16:49

标签: sql oracle oracle11g

我的问题有点类似于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为了参数')

3 个答案:

答案 0 :(得分:3)

如果要删除的行太多,那么您还可以执行 CTAS ,即 create table as select 。从12c开始,CTAS不需要收集统计信息

CTAS 会比 DELETE 快得多。

  • 使用CTAS方法创建新表,仅包含所需行
  • 在此新表上重新创建所需的索引
  • 删除旧表
  • 将新表名重命名为旧表名。

例如,

第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中一列(或多列)的索引将有所帮助。