2016-01-19 13 views
1

得到了下面的代碼,試圖吹走表中的重複的條目: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" 

它反對別名。我嘗試了不同的名字,我嘗試插入「AS」關鍵詞,都無濟於事。從我所知道的,Redshift支持表別名。那麼我做錯了什麼?

回答

0

貌似答案是,別名不支持那裏 - 終於找到了最新的文檔,並沒有顯示出表的別名爲刪除的選項。

此外,/ BTW,當我放棄了別名,RS表示,不知道有關ctid-這是Postgres的8.0和8.2。所以這可能對RS無效。

+0

剛剛遇到同樣的問題:第一個別名沒有工作,然後我發現RedShift不支持'ctid'。你有沒有找到另一個領域使用,而不是它? – punkrockpolly

0

紅移不知道ctid,因爲你沒有別名min(b.ctid)

AFAICT,這是刪除,但可能不是您構建的方式。您的子查詢與刪除目標相關聯。我(親自)不會對使用該查詢結構刪除的正確行感到放心,即使它會運行。

由於Redshift不支持DELETE中的連接,所以我重新編寫了一次以使用IN列表。最裏面外之:

  • 發現MIN()ctideventid在指定日期的
  • 加入到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 
;