2012-03-27 98 views
2

在這裏,我有一個表叫CoreTracks:從單一行中選擇重複項?

+---------+-----------------+----------+----------+----------+---------+ 
| TrackId |  URI  | ArtistID | Title | FileSize | BitRate | 
+---------+-----------------+----------+----------+----------+---------+ 
| 1  | /home/music/... | 234 | atune | 8958223 | 192 | 
| 2  | /home/music/... | 427 | goodsong | 6954373 | 192 | 
| 3  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
| 4  | /home/music/... | 427 | goodsong | 5839962 | 160 | 
| 5  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
| 6  | /home/music/... | 522 | another | 3458859 | 128 | 
+---------+-----------------+----------+----------+----------+---------+ 

我想要檢索的是:

+---------+-----------------+----------+----------+----------+---------+ 
| TrackId |  URI  | ArtistID | Title | FileSize | BitRate | 
+---------+-----------------+----------+----------+----------+---------+ 
| 3  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
| 4  | /home/music/... | 427 | goodsong | 5839962 | 160 | 
| 5  | /home/music/... | 427 | goodsong | 4695698 | 128 | 
+---------+-----------------+----------+----------+----------+---------+ 

我試圖消除基於具有相同的標題,同一藝術家ID重複,和不同的曲目ID,而不返回具有最高比特率和最高文件大小的條目。

我到目前爲止是這樣的:

SELECT * FROM CoreTracks 
WHERE Title = Title AND ArtistID = ArtistID 
AND BitRate != (SELECT MAX(BitRate) FROM CoreTracks WHERE Title = Title AND ArtistID = ArtistID) 
AND FileSize != (SELECT MAX(FileSize) FROM CoreTracks WHERE Title = Title AND ArtistID = ArtistID); 

它返回每個軌道。我錯過了什麼使這個查詢工作?

回答

2

這會得到相反的(即跳過式兩份):

SELECT c1.* 
    FROM CoreTracks c1 
     ,(SELECT Title, ArtistID, MAX(FileSize) AS maxFileSize, MAX(BitRate) maxBitRate 
      FROM CoreTracks 
      GROUP BY Title, ArtistID) c2 
    WHERE c1.Title = c2.Title 
    AND c1.ArtistID = c2.ArtistID 
    AND (c1.FileSize = c2.maxFileSize OR c1.BitRate = c2.maxBitRate) 

而重複:

SELECT c1.* 
    FROM CoreTracks c1 
     ,(SELECT Title, ArtistID, MAX(FileSize) AS maxFileSize, MAX(BitRate) maxBitRate 
      FROM CoreTracks 
      GROUP BY Title, ArtistID) c2 
    WHERE c1.Title = c2.Title 
    AND c1.ArtistID = c2.ArtistID 
    AND (c1.FileSize != c2.maxFileSize AND c1.BitRate != c2.maxBitRate) 
+0

真不可思議。非常感謝! – 2012-03-27 22:28:07

+0

而不是選擇重複的結果,我該如何去刪除它們? – 2012-04-05 04:05:36

+1

@BrandonMinton你可以做一個「從CoreTracks WHERE TrackId中刪除(SELECT c1.TrackId FROM ...) – Glenn 2012-04-05 11:32:21

0

從標題中選擇max(trackId),ArtistID按BitRate asc排序 - 然後在由trackId選擇的另一個選項中進行換行?

0
SELECT A.* FROM CoreTracks A, CoreTracks B 
WHERE A.Title = B.Title AND A.ArtistID = B.ArtistID AND A.trackId != B.trackId 
HAVING A.BitRate != MAX(A.BitRate) AND A.FileSize != MAX(A.FileSize); 

尚未測試,但應該工作。

+0

這看起來不錯。我正在使用sqlite(我是新來的),它返回一個錯誤:「SQL錯誤:濫用聚合函數max()」。 – 2012-03-27 01:07:14

+0

嘗試使用HAVING編輯版本:只需複製並粘貼。 – kasavbere 2012-03-27 01:12:06

+0

另外如果你想永久刪除,你可以用SELECT替換DELETE。 – kasavbere 2012-03-27 01:13:02

0

嘗試自連接,而不是正常的查詢。 我沒試過。