Я предложил бы использовать Метафон , не Soundex. Как отмечено, Soundex был разработан в 19-м веке для американских имен. Метафон даст Вам некоторые результаты при проверке работы плохих спеллеров, кто "выведывает его" и записывает фонетически.
расстояние Редактирования способно находить опечатки, такие как повторенные буквы, транспонированные буквы, или нажимать неправильную клавишу.
Рассматривают заявление для решения, который будет соответствовать пользователям best— или используйте обоих вместе с Метафоном, дополняющим предложения, произведенные Levenshtein.
Относительно исходного вопроса, я использовал n-граммы успешно в приложениях информационного поиска.
Это можно сделать с помощью подзапроса:
SELECT d.docID, docTitle, c.dateAdded, c.content
FROM document d LEFT JOIN content c ON c.docID = d.docID
WHERE dateAdded IS NULL
OR dateAdded = (
SELECT MAX(dateAdded)
FROM content c2
WHERE c2.docID = d.docID
)
Это известно как «групповой максимум» запрос
Изменить: запрос возвращал все строки документа, с NULL, если нет связанного содержимого.
Использование:
SELECT t.docid,
t.docTitle,
mc.dateAdded,
mc.content
FROM DOCUMENT t
JOIN (SELECT c.docid,
c.content,
MAX(c.dateAdded)
FROM CONTENT c
GROUP BY c.docid, c.content) mc ON mc.docid = t.docid
AND mc.dateadded = t.dateadded
Это должно быть быстрее, чем коррелированный подзапрос.
Альтернатива, когда нет записей содержимого для документа:
SELECT t.docid,
t.docTitle,
mc.dateAdded,
mc.content
FROM DOCUMENT t
LEFT JOIN (SELECT c.docid,
c.content,
MAX(c.dateAdded)
FROM CONTENT c
GROUP BY c.docid, c.content) mc ON mc.docid = t.docid
AND mc.dateadded = t.dateadded
Не могли бы вы просто выполнить простое соединение, отсортировать по дате добавления и получить только первую запись?
SELECT docTable.docId, docTable.docTitle from docTable
INNER JOIN content ON content.docID = docTable.contentID
WHERE docTable.docId = <some id>
ORDER BY content.dateAdded DESC
Это 2 запроса решение:
Первый запрос:
select docID, max(dateadded) from [TblContent] group by docID
Второй запрос:
select [TblDocument].* from [TblDocument]
inner join [TblDocument] on [TblDocument].[Docid]=[FirstQuery].[DocID]
попробуйте следующее:
select d.id, d.docTitle, MAX(c.dateAdd)
from document_table d
left join content_table c
on d.id = c.docId
group by d.id
Вот что стоит за этим: предположим, документ таблица имеет запись A, относящуюся к содержимому (1, 2, 3, 4), и запись B, относящуюся к (5,