sql语法组由

时间:2013-03-23 15:41:55

标签: sql sql-server

因为我对sql和设计师不好而不能使用它而苦苦挣扎。基本上,如果用户正在关注相关标签,则会获取主题列表。

我需要按T.TopicId分组才能停止重复。如果用户选择与主题相关联的多个标签,则会列出主题两次(每个标签一次)

当我在sql中添加一个组时,我得到了多个错误,我已经尝试重新安排事情并且无法使其工作,正如所说我对sql语句没用“

@id int = null
AS
SELECT
*
FROM
(SELECT
    ROW_NUMBER()
        OVER 
            (ORDER BY TopicOrder desc
             ,
             (CASE 
                WHEN M.MessageCreationDate > T.TopicCreationDate THEN M.MessageCreationDate
                ELSE T.TopicCreationDate
            END) desc)
        AS RowNumber
    ,T.TopicId, T.TopicTitle, T.TopicShortName, T.TopicDescription, T.TopicCreationDate, T.TopicViews, T.TopicReplies, T.UserId, T.TopicTags, T.TopicIsClose, 
                     T.TopicOrder, T.LastMessageId, T.UserName, M.MessageCreationDate, M.UserId     AS MessageUserId, MU.UserName AS MessageUserName, U.UserGroupId, 
                     U.UserPhoto, T.UserFullName
FROM            Tags INNER JOIN
                     TopicsComplete AS T ON T.TopicId = Tags.TopicId LEFT OUTER JOIN
                     Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND     M.Active = 1 LEFT OUTER JOIN
                     Users AS MU ON MU.UserId = M.UserId LEFT OUTER JOIN
                     Users AS U ON U.UserId = T.UserId LEFT OUTER JOIN
                     tagfollows AS TF ON @id = TF.userid
WHERE        (Tags.Tag = TF.tag)
 )T 

如果有人能提供帮助,我们将不胜感激,谢谢! :)

2 个答案:

答案 0 :(得分:0)

您说您希望在用户关注的集合中显示带有标记的帖子,但是当您有多个匹配标记时,您不希望该帖子多次显示。这是EXISTS subquery的完美用法。这是MSDN页面的一个例子。

SELECT a.FirstName, a.LastName
FROM Person.Person AS a
WHERE EXISTS
(SELECT * 
    FROM HumanResources.Employee AS b
    WHERE a.BusinessEntityID = b.BusinessEntityID
    AND a.LastName = 'Johnson');

你真的对person表感兴趣(比如你的帖子表),但你想要显示员工中至少有一条匹配记录的记录(比如你的标签表)。

答案 1 :(得分:0)

我认为您只需要将连接转换为tagfollowsEXISTS子查询(并删除冗余嵌套):

SELECT
    ROW_NUMBER()
        OVER ( ORDER BY TopicOrder desc
                      , CASE WHEN M.MessageCreationDate > T.TopicCreationDate 
                            THEN M.MessageCreationDate
                            ELSE T.TopicCreationDate
                        END desc )
        AS RowNumber,
    T.TopicId, T.TopicTitle, T.TopicShortName, T.TopicDescription, 
    T.TopicCreationDate, T.TopicViews, T.TopicReplies, T.UserId, 
    T.TopicTags, T.TopicIsClose, T.TopicOrder, T.LastMessageId, 
    T.UserName, M.MessageCreationDate, 
    M.UserId    AS MessageUserId, 
    MU.UserName AS MessageUserName, 
    U.UserGroupId, U.UserPhoto, T.UserFullName
FROM
        TopicsComplete AS T
    LEFT OUTER JOIN
        Messages AS M        ON  M.TopicId = T.TopicId 
                             AND M.MessageId = T.LastMessageId
                             AND M.Active = 1 
    LEFT OUTER JOIN
        Users AS MU          ON  MU.UserId = M.UserId 
    LEFT OUTER JOIN
        Users AS U           ON  U.UserId = T.UserId
WHERE   EXISTS
        ( SELECT  *
          FROM    Tags
              INNER JOIN tagfollows AS TF
                  ON  Tags.Tag = TF.tag 
          WHERE   T.TopicId = Tags.TopicId 
            AND   @id = TF.userid   
        ) ;