2016-12-15 45 views
0

我有一個非常大的表稱爲跑步者約有50,00重複的實例,我想刪除重複。 經過一番實驗後,我得到一個查詢工作,突出重複。de重複訪問數據庫

然後我試圖設置一個名爲'del'的新字段爲true,這樣我就可以隨心所欲地刪除了。我嘗試了一個成功查詢的連接,但我收到一條錯誤消息「Error in Update syntax」,並依賴於「UPDATE」

我的SQL是這樣的:

`Update History A 
INNER JOIN 
(
SELECT Max(History.rDate) AS lastRun, History.Runner, History.rtime, History.source, Count(History.rdate) AS occurrs, History.rDate, History.audittime 
FROM History 
GROUP BY History.Runner, History.rtime, History.source, History.rDate, History.audittime 
HAVING (((Count(1))>1)) 
)B 

SET A.del =-1 
ON ((A.rdate =B.rdate) AND (A.Runner =B.runner)) 
WHERE A.audittime < B.audittime 
;` 

任何意見或建議將是一個很大的幫助。謝謝

+0

爲什麼你聚集和組由同一列:'rDate'?另外,'rDate'不是日期時間,所以'rtime'是什麼?和'audittime'? – Parfait

+0

'on'子句是否必須在'set'之前出現? – xQbert

回答

0

考慮使用相關子查詢的直接DELETE語句。對您的數據不太確定,但在下面刪除rdate字段當中的轉輪來源分組(因爲這兩個字段看起來像日期時間以外的唯一標識符)。

DELETE 
FROM History main 
WHERE main.rDate IN 
    (SELECT Max(h.rDate) AS lastRun 
    FROM History h 
    WHERE h.Runner = main.Runner AND h.source = main.source   
    HAVING Count(1) > 1) 

現在,如果有超過2個副本,您可能需要直到不再更改後再次,然後再次運行此查詢。另外,運行以下DELETE其中僅保持最低RDATE

DELETE 
FROM History main 
WHERE NOT main.rDate IN 
    (SELECT Min(h.rDate) AS lastRun 
    FROM History h 
    WHERE h.Runner = main.Runner AND h.source = main.source) 
AND 
    (SELECT Count(*) 
    FROM History h 
    WHERE h.Runner = main.Runner AND h.source = main.source) > 1 
+0

感謝您的答案。 到Parfait。是的,查詢看起來有點混亂,我需要視覺上得到正確的數據: 更簡單的版本是: – user3592901

+0

@ Parfait。 SELECT max(History.rDate)AS lastRun,History.Runner,Count(History.rdate)AS發生者,History.audittime 歷史 GROUP BY History.Runner,History.audittime 具有:(((計數(1))> 1)) 我與其他建議掙扎 – user3592901

+0

auditime是告訴我準確的以TIMEDATE時間添加了一條記錄。例如,保留最後一個是有用的。 在調試過程中,必須允許欺騙,現在需要刪除它們。 我不想要兩個記錄具有相同的rdate(可能需要是相同的rdate和rtime),但現在保持簡單 – user3592901