RedShift:Delete语句不允许表别名?

时间:2016-01-19 18:04:09

标签: amazon-redshift

获得以下代码以尝试吹掉表中的重复条目:

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"

它反对别名。我尝试过不同的名字,我试过插入&#34; AS&#34;关键词,一切无济于事。据我所知,Redshift支持表别名。那么我做错了什么?

2 个答案:

答案 0 :(得分:1)

Redshift不了解ctid,因为您没有别名min(b.ctid)

AFAICT,这种删除是可能的,但不是你的结构方式。您的子查询与删除目标相关联。我(个人)对使用该查询结构删除正确的行感到不自信,即使它会运行。

由于Redshift不支持DELETE中的联接,因此我使用IN列表重新编写了一些内容。最内层到外层:

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

此处的优势在于您可以确切地确认将从表格中删除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
;

答案 1 :(得分:0)

看起来答案是那里不支持别名 - 最后跟踪了最新的文档,它没有显示表别名作为删除选项。

另外,/ BTW,当我删除别名时,RS说它不知道ctid-这是在Postgres 8.0和8.2中。所以这可能不适用于RS。