отказ от ответственности: У меня нет полного контроля над схемой БД, не судите структуру данных или соглашения об именах:)
Я делаю этот большой запрос с несколькими объединениями:
SELECT TOP 30
iss.iss_lKey as IssueId,
iss.iss_sName as IssueName,
con.con_lKey as ContainerId,
con.con_sName as ContainerName,
sto.sto_lKey as StoryId,
sto.sto_sName as StoryName,
sto.sto_Guid as StoryGuid,
sto.sto_sByline as Byline,
sto.sto_created_dWhen as StoryCreatedDate,
sto.sto_deadline_dWhen as StoryDeadline,
sto.sto_lType as StoryType,
sto.sto_sct_lKey as StoryCategory,
sto.sto_created_use_lKey as CreatedBy,
sfv.sfv_tValue as FieldValue,
sf.sfe_lKey as StoryFieldId,
sf.sfe_sCaption as StoryFieldCaption,
sre.sre_lIndex as RevisionIndex
FROM tStory30 sto
JOIN tContainer30 con ON sto.sto_con_lKey = con.con_lKey
JOIN tIssue30 iss ON con.con_iss_lKey = iss.iss_lKey
LEFT OUTER JOIN tStoryRevision30 sre ON sre.sre_sto_lKey = sto.sto_lKey
LEFT OUTER JOIN tStoryField30 sf ON sre.sre_lKey = sf.sfe_sre_lKey
LEFT OUTER JOIN tStoryFieldValue30 sfv ON sfv.sfv_sfe_lKey= sf.sfe_lKey
WHERE sre.sre_lIndex = 0
AND (sto.sto_sName LIKE '%' + @0 + '%'
OR sfv.sfv_tValue LIKE '%' + @0 + '%')";
Что мне действительно нужно, так это только одна строка StoryId, которая включает FieldValue, которая соответствовала бы, если таковая была. В настоящее время я группирую код для вывода, но это не позволяет мне разбивать результаты на страницы.
from r in items
group r by new { r.StoryId, r.ContainerId, r.IssueId }
into storyGroup
select {
storyGroup.Key.StoryId,
storyGroup.Key.ContainerId,
storyGroup.Key.IssueId,
Hits = storyGroup.ToList()
}
Есть ли способ достичь такого типа группировки в sql, чтобы я мог затем правильно отобразить результат (используя ROW_NUMBER () OVER)?
Кроме того, я знаю, что это плохая практика и должен использовать полнотекстовый поиск. планируется настроить экземпляр solr или использовать полнотекстовые параметры в sqlserver. Это первая попытка запустить что-то.
EDIT
пытается устно объяснить, чего я пытаюсь достичь:
Для контекста наше приложение представляет собой cms для редактора / издателя журнала.
для данного журнала у них много выпусков
в каждой проблеме много контейнеров (вроде логической группы статей)
в каждом контейнере у вас есть несколько историй
сюжетный фургон имеет 0 или много ревизий
поля истории хранятся в редакции (много полей в редакции)
и поле имеет значение поля.
Мне нужно извлечь истории, которые имеют заданный текст в имени или в значении поля первой ревизии (это где revisionIndex = 0).
но мне также нужно получить связанные данные для каждой истории. (IssueId, name, containerId и name, и так далее ..)
Трудно, вероятно, найти одно из значений поля, которое соответствует поиску. Мне не нужны все они, только один ...
надеюсь, это поможет!
РЕДАКТИРОВАТЬ Пример поиска данных для «теста» . Я упростил столбцы, чтобы их было легче понять.
Row | IssueId | IssueName | ContainerId | StoryId | FieldValue
1 | 11 IssueName A 394 868 Test Marsupilami bla bla youpi
2 | 40 IssueName B 6 631 story save test
3 | 40 IssueName B 6 666 test story
4 | 4 IssueName c 30 846 test abs
5 | 4 IssueName c 30 846 absc test
6 | 4 IssueName c 30 846 hello test
Я могу получить номер строки в sqlserver по моему запросу, но здесь, как вы видите, я получаю несколько раз одну и ту же историю. В этом случае я мог бы получить следующий простой результат:
Row | IssueId | IssueName | ContainerId | StoryId | FieldValue
1 | 11 IssueName A 394 868 Test Marsupilami bla bla youpi
2 | 40 IssueName B 6 631 story save test
3 | 4 IssueName c 30 846 test abs
если у истории будет проверка в названии истории, тогда я в порядке с нулевым значением в столбце FieldValue, какое значение поля выбрано, не имеет большого значения.