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/

相关文章:

sql - 不带引号的 Sqoop 语句

php - 如果价格已降低,则从 mySQL 数据库获取一行

mysql - 在两列中查找具有最大匹配字符串的行

c# - sql连接字符串问题

mysql - GROUP CONCAT 由于某种原因不工作

sql - Derby和DB2之间的可移植模式

python - 使用 Python 和 FaSTLoad 实用程序将 csv 上传到 Teradata DB

sql - Teradata 性能问题和示例

teradata - 如何使用 UTF-8 编码提取 Teradata .TPT 文件

r - 使用odbc/dbplyr时如何按日期+常量过滤?更新问题