Netezza 使用 JOIN 删除

Posted

技术标签:

【中文标题】Netezza 使用 JOIN 删除【英文标题】:Netezza delete using JOIN 【发布时间】:2014-03-03 04:25:43 【问题描述】:

我在 Netezza 中有两张桌子。表 A 有 ~70B 记录,表 B 有 ~15K 记录。删除需要在表 A 上进行,但是我必须加入 2 列。我的查询看起来像这样

从 A 中删除 where (a.col1, a.col2) in (select col1, col2 from B)。

我看到计划非常昂贵,正在寻找替代方法。 netezza 是否支持 JOIN ON DELETE?有人有其他方法吗??

【问题讨论】:

【参考方案1】:

您可以使用rowid 来实现您正在寻找的内容:

delete from table_A
where rowid in (select a.rowid
from table_A a inner join
table_B b
on a.col1=b.col1
and a.col2=b.col2)

【讨论】:

我看到计划现在朝着不同的方向发展;探索“存在”选项。【参考方案2】:

您也可以使用 EXISTS() 作为替代语法:

delete from table_A a
where exists(select 1 from table_b b
    where b.col1=a.col1
      and b.col2=a.col2
)

编辑: 这样做的开销相当低,因为它不需要构建连接或收集任何东西,它只需要检查记录是否存在。

【讨论】:

从我的角度来看,这比实际答案更通用,更好,因为它不要求存在唯一键(这是我的情况)。【参考方案3】:

另一种方法是使用 CTAS 创建一个没有记录的表并重命名它。我相信这里产生的成本会更少。

create table T1 as select 
col1,col2 from A where (col1,col2) 
not in (select col1,col2 from B);

drop table A;

alter table T1 rename to A;

【讨论】:

以上是关于Netezza 使用 JOIN 删除的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Netezza 删除用户

来自多个表的 Postgres/netezza 多重连接

netezza 左外连接查询性能

无法从 Netezza 表中删除重复数据

JOIN 替代 SELECT 子查询

从 netezza 表中清除记录