获得以下代码以尝试吹掉表中的重复条目:
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支持表别名。那么我做错了什么?
答案 0 :(得分:1)
Redshift不了解ctid
,因为您没有别名min(b.ctid)
。
AFAICT,这种删除是可能的,但不是你的结构方式。您的子查询与删除目标相关联。我(个人)对使用该查询结构删除正确的行感到不自信,即使它会运行。
由于Redshift不支持DELETE
中的联接,因此我使用IN
列表重新编写了一些内容。最内层到外层:
MIN()
ctid
的每个eventid
events
ctid
不匹配eventid
与ctid
DELETE
列表和相同的concat 的事件中的IN
此处的优势在于您可以确切地确认将从表格中删除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
;
答案 1 :(得分:0)
看起来答案是那里不支持别名 - 最后跟踪了最新的文档,它没有显示表别名作为删除选项。
另外,/ BTW,当我删除别名时,RS说它不知道ctid-这是在Postgres 8.0和8.2中。所以这可能不适用于RS。