如何删除Teradata表中不在另一个表中的行?

5

我的情况比较棘手的是,我没有单列键,也没有一个简单的主键列表可供删除(例如,“delete from table where key in ([list])”)。我的主键由多个列组成,需要在所有列上进行联接。

根据我对其他数据库的了解,我认为可以这样做:

DELETE FROM
    table1 t1
  LEFT OUTER JOIN
      table2 t2
    ON
      t2.key1 = t1.key1 AND
      t2.key2 = t1.key2
  WHERE
    t2.key1 IS NULL;

但是Teradata(v12)会响应错误代码3706,提示“语法错误:不允许在FROM子句中使用连接表。”
2个回答

12

发现这是通过以下方式完成的:

DELETE FROM
    table1
  WHERE
    (key1, key2) NOT IN (
      SELECT UNIQUE key1, key2 FROM table2
    );

3

另一种方法是使用相关子查询:

Delete From Table1
Where Not Exists(
                Select 1 
                From Table2 
                Where Table2.key1 = Table1.key1
                    And Table2.key2 = Table1.key2
                )

我提供的答案与这个有什么性能优势吗? - Paul Hooper
@Paul Hooper - 确定的方法是分析执行计划并进行一些测试。如果Table2显着更大,并且每个匹配行中有许多行,则它可能表现更好,因为它可以在找到第一个项目时停止处理。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接