【问题标题】:delete rows in parent-child tables found in another parent-child tables删除在另一个父子表中找到的父子表中的行
【发布时间】:2014-06-16 17:54:07
【问题描述】:

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

这个查询

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 中加载的 staging 中的内容。但是如何从暂存数据库中的父子表对中删除?我正在画一个“空白”....我试过了,但它爆炸了(“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 选项,但我什至不确定它是否受支持....有什么想法吗?

【问题讨论】:

  • joined tables not allowed in from clause吗?我敢打赌,在这种情况下,您需要弄清楚如何在 WHERE EXISTS 子句中完成同样的事情。
  • 你找到答案了吗?
  • 你试过级联吗??
  • 很遗憾,我们的 Teradata db 版本不支持 DELETE CASCADE。

标签: sql teradata


【解决方案1】:

无法在单个 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 )

如果您将此作为多语句请求运行,则连接将只执行一次。

【讨论】:

  • 这很有道理!!我会试一试,并在接下来的 24 小时内报告。
  • 先从子删除,再从父删除。 ;-)
  • @Janine Rawnsley:你说得对,我只是使用剪切和粘贴 :-) 而且我认为父子关系只是一个逻辑,它们几乎没有在数据模型中实现一个数据仓库。否则,您可以简单地使用子表删除而不加入父表:-)
  • 向 dnoeth 授予赏金。对延误表示歉意。谢谢大家。
【解决方案2】:

你可以试试这样的:

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

与使用 EXISTS 的子查询相比,OUTER JOIN 效率更高,尤其是对于大型数据集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2014-04-23
    • 1970-01-01
    • 2021-12-09
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多