После импорта информации о песнях в мою базу данных SQLite я хочу использовать инструкцию SELECT, чтобы найти все возможные дубликаты песен, используя следующие критерии:
songName в одной строке, аналогичной или равной songName в любой другой строке в той же таблице (Songs), а ArtistID одинаков в обеих строках. Это должно работать, не зная содержимого songName. Если я хочу сравнить известное название песни со всеми другими в базе данных, это можно сделать с помощью «songName LIKE '% known name%'», но как мне найти все дубликаты без этого?
Пример таблицы композиций:
id songName artistID duration
--------------------------------------------
0 This is a song 5 3:43
1 Another song 3 3:23
2 01-This is a song 5 3:42
3 song 4 4:01
4 song 4 6:33
5 Another record 2 2:45
Ожидаемые результаты:
id songName artistID duration
--------------------------------------------
0 This is a song 5 3:43
2 01-This is a song 5 3:42
3 song 4 4:01
4 song 4 6:33
EDIT:
Поскольку была предложена идея создания хеша и сравнения их, я думаю об использовании этой псевдо-функции для создания хеша для каждого названия песни:
Public Function createHash(ByVal phrase As String) As String
'convert to lower case
phrase = LCase(phrase)
'split the phrase into words
Dim words() As String = phrase.Replace("_", " ").Split(" ")
Dim hash As String = ""
For w = 0 To words.Count - 1
'remove noise words (a, an, the, etc.)
words(w) = removeNoiseWords(words(w))
'convert 1 or 2-digit numbers to corresponding words
words(w) = number2word(words(w))
Next
'rebuild using replaced words and remove spaces
hash = String.Join("", words)
'convert upper ascii into alphabetic (ie. ñ = n, Ö = O, etc.)
hash = removeUnsupChars(hash, True)
'strip away all remaining non-alphanumeric characters
hash = REGEX_Replace(hash, "[^A-Za-z0-9]", "")
Return hash
End Function
Как только хеш будет вычислен, я сохраню его для каждой записи, а затем выберу дубликаты, используя количество (хеш)> 1. Затем я буду использовать .NET-код, чтобы увидеть, является ли artistID одинаковым для возвращенных записей.
Похоже, это решение пока работает нормально. Вот оператор SQLite, который я использую, чтобы найти дубликаты песен:
SELECT count(*),hash from Songs GROUP BY hash HAVING count(hash) > 1 ORDER BY hash;
Это дает мне список всех хэшей, которые встречаются более одного раза. Я сохраняю эти результаты в массиве, затем циклически перебираю массив и просто использую этот оператор для получения подробной информации:
For i = 0 To dupeHashes.Count - 1
SQLconnect.Open()
SQLcommand = SQLconnect.CreateCommand
SQLcommand.CommandText = "SELECT * from Songs WHERE hash = '" & dupeHashes(i) & "';"
SQLreader = SQLcommand.ExecuteReader()
While SQLreader.Read()
'get whatever data needed for each duplicate song
End While
SQLcommand.Dispose()
SQLconnect.Close()
Next