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

标签 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 中加载的 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 选项,但我什至不确定它是否受支持......有什么想法吗?

最佳答案

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

如果您将其作为多语句请求运行,则联接将仅完成一次。

关于sql - 删除在另一个父子表中找到的父子表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24249440/

相关文章:

teradata - 解释 Teradata 中的查询带

database - 在 Debian 或 CentOS 中安装 Teradata

sql - Teradata : Casting Seconds to Hours, 分钟和秒

java - "Escape"绑定(bind)变量?在 JDBC SQL 搜索中

sql - 如何在windows上安装pgAgent服务

javascript - 对 SQL 查询进行排队

hadoop - 使用 sqoop 将数据从 Teradata 迁移到 Hive

hadoop - 无效的表别名或列引用 'SYNTHJOIN_xxxxx'

mysql - 如何动态地从另一个表中检索最近的日期 MySQL

php - 将字段添加到数据库/覆盖现有下拉列表中的默认选项