sql语法分组依据

sql语法分组依据,sql,sql-server,Sql,Sql Server,我对sql和designer不太在行,所以在过度使用的情况下,我无法解决这个问题。基本上,这是一个主题列表,如果用户遵循一个相关的标签 我需要按T.TopicId分组以停止重复。如果用户选择与主题关联的多个标记,则会列出两次主题(每个标记一次) 当我在sql中添加一个GROUPBY时,我会出现多个错误,并且我尝试重新安排内容,但无法使其工作,正如前面所说的,我对sql语句毫无用处 @id int = null AS SELECT * FROM (SELECT ROW_NUMBER()

我对sql和designer不太在行,所以在过度使用的情况下,我无法解决这个问题。基本上,这是一个主题列表,如果用户遵循一个相关的标签

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

当我在sql中添加一个GROUPBY时,我会出现多个错误,并且我尝试重新安排内容,但无法使其工作,正如前面所说的,我对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 

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

您说您希望在用户遵循的集合中显示带有标记的帖子,但不希望帖子在有多个匹配标记时显示多次。这是一个完美的使用。下面是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表(如posts表)感兴趣,但希望在employee(如tags表)中显示至少有一条匹配记录的记录。

我认为您只需将join to
tagfollows
转换为
EXISTS
子查询(并删除冗余嵌套):


看起来太复杂了,不符合你的要求。顺便问一下,这是sql server吗?是的,这段代码很好用。我只是想把group by放在where下,但它抱怨说,聚合函数或group by中的所有T.的arnt都可以将join to
tagfollows
转换为
EXISTS
subquery.hi ypercube,有没有可能显示出这是什么样子,我一直在尝试创建一个额外的子查询,但没有成功。谢谢您的尝试,但这会返回相同的数据。问题是,如果一个用户在2个标记之后使用,那么下面的标记将是例如1个sample,1个sample2(1是userid)。如果一个主题同时具有标记sample和sample2,它将返回两个标记的结果。如果它是由一组TopicId完成的,那么它只会对任何重复项进行分组。不确定where exists是否适用,因为这两个标记将作为单独的标记存在。标记
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   
        ) ;