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
不匹配
连接eventid
和ctid
DELETE
来自使用 IN
列表和相同 concat 的事件
这里的好处是您可以准确地确认eventid
和ctid
的哪些组合将从表中删除。我不清楚您是否还需要将 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:删除语句不允许表别名?的主要内容,如果未能解决你的问题,请参考以下文章