使用不同表达式的sql联合

使用不同表达式的sql联合,sql,sql-server,Sql,Sql Server,我有一个sql,它不能工作,因为两个联合都有不同的表达式,如何才能做到这一点?谢谢(mssql存储过程)我不知道从这里到哪里去 SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY T.TopicCreationDate desc) AS RowNumber ,T.TopicId, T.TopicTitle, T.TopicShortName, T.Top

我有一个sql,它不能工作,因为两个联合都有不同的表达式,如何才能做到这一点?谢谢(mssql存储过程)我不知道从这里到哪里去

SELECT
*
FROM
(SELECT
    ROW_NUMBER()
        OVER 
            (ORDER BY T.TopicCreationDate 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, T.ReadAccessGroupId, T.PostAccessGroupId, U.UserGroupId, U.UserPhoto, T.UserFullName
    ,M.UserId AS MessageUserId
    ,MU.UserName AS MessageUserName
FROM            TopicsComplete AS T  LEFT OUTER JOIN
                     Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND M.Active = 1  INNER JOIN
                     Users AS U ON U.UserId = T.UserId
    LEFT JOIN Users MU ON MU.UserId = M.UserId
        WHERE   EXISTS
    (  SELECT  *
      FROM    TopicsComplete
LEFT OUTER JOIN
                     Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND M.Active = 1 INNER JOIN
                     Users AS U ON U.UserId = T.UserId LEFT OUTER JOIN
                     Users AS MU ON MU.UserId = M.UserId
WHERE        (T.UserId = @id)
          UNION
        SELECT  *
      FROM    TopicsComplete
            LEFT OUTER JOIN
                     Messages AS M ON M.TopicId = T.TopicId AND M.MessageId = T.LastMessageId AND M.Active = 1 INNER JOIN
                     topicfollows AS TF ON T.TopicId = TF.topicid INNER JOIN
                     Users AS U ON U.UserId = T.UserId LEFT JOIN 
                     Users MU ON MU.UserId = M.UserId
WHERE        (TF.userid = @id)
          )

) T

联合体双方返回的所有列都必须匹配(列数及其数据类型,而不是实际名称/别名)

首先,不要使用
SELECT*
指定返回的列。这是一个导致问题的坏习惯,例如,当您向其中一个表中添加新列时

其次,如果联合的一部分没有足够的列,请指定一些常量为这些列提供值(为清晰起见,添加别名),例如

SELECT 0 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, T.ReadAccessGroupId, T.PostAccessGroupId, U.UserGroupId, U.UserPhoto, T.UserFullName