2012-03-27 19 views
2

ここで私はCoreTracksと呼ばれるテーブルを持っている:私は取得したい何1つの行から重複を選択しますか?

+---------+-----------------+----------+----------+----------+---------+ 
| 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、およびAを有することに基づいて重複を削除しようとしています最高のビットレートと最高のファイルサイズを持つエントリを返さないで、別のトラック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

それは信じられないほどです。大変ありがとう!重複結果を選択する代わりに –

+0

を削除すると、どうすれば削除できますか? –

+1

@BrandonMintonあなたは "CoreTracks Where TrackId INからDELETEを実行することができます(SELECT c1.TrackId FROM ...) – Glenn

0

グループ(タイトル別、ArtistID、BitRate別)から最大(トラックID)を選択します。asc - トラックID別に選択してラップしますか?

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エラー:集計関数の最大()"の悪用。 –

+0

HAVINGで編集したバージョンを試してください:コピー&ペーストするだけです。 – kasavbere

+0

また、永続的に削除する場合は、SELECTをDELETEに置き換えることができます。 – kasavbere

0

自己ではなく、通常のクエリのジョインを試してみてください。 私はそれを試していませんでした。

関連する問題