2013-03-23 63 views
0

掙扎與此,因爲我不擅長與SQL和設計器不會與OVER使用工作。基本上,如果用戶正在關注相關標籤,則會獲取主題列表。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 

如果有人能幫助它將不勝感激,謝謝! :)

+0

看起來對你說你想要的方式太複雜了。順便說一句,這是SQL服務器? – 2013-03-23 15:45:27

+0

是的,這段代碼工作正常。我只是想把這個小組放在哪裏,但是然後它抱怨說所有的T.'s在一個聚合函數或小組中出現了 – mxadam 2013-03-23 15:51:45

+1

您可以將連接轉換爲'tagfollows'到一個'EXISTS'子查詢中。 – 2013-03-23 16:02:37

回答

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 
     ) ; 
+0

嘿ypercube,謝謝你嘗試,但這返回相同的數據。問題是如果一個用戶使用2個標籤,那麼tagfollows將會是例如1個樣本,1個樣本2(1個是用戶標識)。如果一個主題同時具有標籤sample和sample2,它將返回兩個標籤的結果。如果它是由TopicId組完成的,那麼它只會分組任何重複。不知道是否存在適用,因爲這兩個標籤將作爲一個單獨的標籤存在Tags.Tag – mxadam 2013-03-23 16:30:13

+0

我已經做了一個更正。 – 2013-03-23 16:30:17

+0

這個作品完美,謝謝ypercube你的明星! – mxadam 2013-03-23 16:51:26

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'); 

你在人表(如您的職位表)很感興趣,但你想顯示在員工至少一個匹配記錄(如您的標籤表)的記錄。