Группировка результатов для получения уникальных строк после нескольких объединений - PullRequest
0 голосов
/ 20 сентября 2011

отказ от ответственности: У меня нет полного контроля над схемой БД, не судите структуру данных или соглашения об именах:)

Я делаю этот большой запрос с несколькими объединениями:

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, какое значение поля выбрано, не имеет большого значения.

1 Ответ

0 голосов
/ 20 сентября 2011

Это отступление, но знаете ли вы, что вы преобразовали левое соединение во внутреннее соединение?

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

попробуйте вместо этого

LEFT OUTER JOIN tStoryRevision30 sre ON sre.sre_sto_lKey = sto.sto_lKey   
    AND sre.sre_lIndex = 0
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   

(Я бы сделал это в комментарии, но здесь легче увидеть изменение кода.

...