RedShift:删除语句不允许表别名?

Posted

技术标签:

【中文标题】RedShift:删除语句不允许表别名?【英文标题】:RedShift: Delete statement does not allow table alias? 【发布时间】:2016-01-19 18:04:09 【问题描述】:

得到以下代码来尝试清除表中的重复条目:

DELETE FROM events a
WHERE a.ctid <> (SELECT min(b.ctid)
             FROM   events b
             WHERE  a.eventid = b.eventid and
                    left(b.eventtimestamp,10)='2016-01-15');

用我的查询工具和 psql 试过这个,我得到:

Error : ERROR:  syntax error at or near "a"

它反对别名。我试过不同的名字,我试过插入“AS”关键字,都无济于事。据我所知,Redshift 支持表别名。那我做错了什么?

【问题讨论】:

【参考方案1】:

Redshift 不知道 ctid,因为您没有给 min(b.ctid) 起别名。

AFAICT,此删除是可能的,但不是您构建它的方式。您的子查询与删除目标相关。我(个人)对使用该查询结构删除正确的行没有信心,即使它会运行。

由于 Redshift 不支持 DELETE 中的连接,我对其进行了一些修改以使用 IN 列表。从内到外:

根据eventid 查找给定日期的MIN() ctid 再次加入events ctid 不匹配 连接eventidctid DELETE 来自使用 IN 列表和相同 concat 的事件

这里的好处是您可以准确地确认eventidctid 的哪些组合将从表中删除。我不清楚您是否还需要将 events 限制为外部子查询中的给定日期。

DELETE FROM events
WHERE eventid||ctid IN (SELECT a.eventid||a.ctid
                        FROM   events AS a  
                        JOIN   (SELECT eventid, MIN(b.ctid) ctid
                                FROM   events
                                WHERE  LEFT(b.eventtimestamp,10)='2016-01-15'
                                GROUP BY eventid) AS b
                        ON     a.eventid = b.eventid
                        AND    a.ctid <> b.ctid
;

【讨论】:

【参考方案2】:

看起来答案是那里不支持别名-最终找到了最新的文档,并且它没有将表别名显示为删除选项。

另外,/顺便说一句,当我删除别名时,RS 说它不知道 ctid- 在 Postgres 8.0 和 8.2 中。所以这可能无论如何都不适用于 RS。

【讨论】:

刚遇到同样的问题:第一个别名不起作用,然后我发现 RedShift 不支持ctid。你有没有找到另一个字段来代替它?

以上是关于RedShift:删除语句不允许表别名?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift - 提取约束

如果 Redshift 中存在表,则从表中删除行,否则忽略删除

数据库删除数据不支持表别名

Amazon Redshift - 横向列别名参考

DML语句 -- 删除语句

Delete From 语句中带有别名的表变量