2016-03-02 107 views
1

我的CustomTags表可能有一系列「臨時」記錄,其中Tag_ID爲0,並且Tag_Number將具有一些五位數值。Sqlite子查詢的問題

定期地,我想清理我的Sqlite表來刪除這些臨時值。

例如,我可能有:

Tag_ID  Tag_Number 
0   12345 
0   67890 
0   45678 
1   12345 
2   67890 

在這種情況下,我想刪除第2條記錄,因爲它們與實際Tag_ID 1和2重複的,但我不想刪除還沒有複製第三張唱片。

我已經嘗試了許多不同類型的子查詢,但我不能得到它的工作。這是我嘗試的最後一件事,但我的數據庫客戶端抱怨未知的語法錯誤。 (我有和沒有AS嘗試作爲一個別名)

DELETE FROM CustomTags t1 
WHERE t1.Tag_ID = 0 
    AND (SELECT COUNT(*) FROM CustomTags t2 WHERE t1.Tag_Number = t2.Tag_Number) > 1 

任何人都可以提供一些見解?謝謝

+0

如果您發現其中一個令人滿意的答案,我建議通過將其標記爲接受來爲您的問題添加封閉。 – zedfoxus

回答

0

與您的數據集,像這樣:

sqlite> select * from test; 
tag_id  tag_number 
---------- ---------- 
1   12345 
1   67890 
0   12345 
0   67890 
0   45678 

您可以運行:

delete from test 
where rowid not in (
    select a.rowid 
    from test a 
    inner join (select tag_number, max(tag_id) as mt from test group by tag_number) b 
    on a.tag_number = b.tag_number 
    and a.tag_id = b.mt 
); 

結果:

sqlite> select * from test; 
tag_id  tag_number 
---------- ---------- 
1   12345 
1   67890 

請不要測試了這一點,有一些更多的測試用例比你必須完全確定這就是你想要的。我建議在大數據集上運行此數據庫之前創建數據庫的副本。

1

有很多選擇,但最簡單的可能是使用EXISTS;

DELETE FROM CustomTags 
WHERE Tag_ID = 0 
    AND EXISTS(
    SELECT 1 FROM CustomTags c 
    WHERE c.Tag_ID <> 0 AND c.Tag_Number = CustomTags.Tag_Number 
) 

An SQLfiddle to test with

...或... NOT IN

DELETE FROM CustomTags 
WHERE Tag_ID = 0 
    AND Tag_Number IN (
    SELECT Tag_Number FROM CustomTags WHERE Tag_ID <> 0 
) 

Another SQLfiddle