删除在另一个父子表中找到的父子表中的行

时间:2014-06-16 17:54:08

标签: sql teradata

我正在将数据加载到“临时”数据库模式中的父子对表中。如果存在以前加载到“主”数据库模式中的父子对表的重复记录,我想从“登台”数据库表中删除它们。

此查询

SELECT  A.*,B.* 
FROM  STG.AUTO_REPR_PAR_STG A 
 JOIN STG.AUTO_REPR_CHLD_STG B 
 ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
WHERE EXISTS (  SELECT A.*, B.* 
                FROM  MST.AUTO_REPR_PAR A 
                 JOIN MST.AUTO_REPR_CHLD B 
                 ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
             )

将显示以前在master中加载的暂存内容。但是如何从登台数据库中的父子对表中删除?我正在画一个“空白”....我试过这个,但是炸弹(“FROM子句中不允许使用表格”):

   DELETE FROM STG.AUTO_REPR_PAR_STG A 
           JOIN STG.AUTO_REPR_CHLD_STG B
           ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
          WHERE EXISTS (SELECT A.*, B.* 
                        FROM  MST.AUTO_REPR_PAR A 
                        JOIN MST.AUTO_REPR_CHLD B
                        ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
                       )

后端是Teradata v13。我目前正在研究CASCADE DELETE选项,但我甚至不确定它是否受支持....任何想法?

2 个答案:

答案 0 :(得分:3)

在单个DELETE语句中无法从多个表中删除,每个表需要一个:

DELETE FROM STG.AUTO_REPR_PAR_STG A
WHERE TEST_SEQ_NUM IN (
SELECT A.TEST_SEQ_NUM FROM  MST.AUTO_REPR_PAR A JOIN MST.AUTO_REPR_CHLD B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM )
;DELETE FROM STG.AUTO_REPR_CHLD_STG B
WHERE TEST_SEQ_NUM IN (
SELECT A.TEST_SEQ_NUM FROM  MST.AUTO_REPR_PAR A JOIN MST.AUTO_REPR_CHLD B
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM )

如果您将此作为多语句请求运行,则加入仅执行一次。

答案 1 :(得分:0)

您可以尝试这样的事情:

  • 您可以使用OUTER JOIN代替带有EXIST子句的子查询 - 您可以选择目标外表中所有具有NULL列的行,即不匹配的行;
  • 将上一个查询的结果保存到临时表中,然后运行2个DELETE语句。

与具有EXISTS的子查询相比,OUTER JOIN更有效,特别是对于大型数据集。