mxadam
mxadam

Reputation: 167

sql union with different expressions

I have this sql which doesnt work as both unions have different expressions, how can this be done? thanks (mssql stored procedure) have no idea where to go from here

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

Upvotes: 0

Views: 71

Answers (1)

Szymon
Szymon

Reputation: 43023

All the columns returned by both sides of the union have to match (the number of columns and their data types, not the actual names/aliases).

First of all, don't specify the returned columns with SELECT *. It's a bad habit that leads to problems, e.g. when you add a new column to one of the tables.

Secondly, if one part of the union doesn't have enough columns, specify some constants to provide values for those columns (adding an alias for clarity), e.g.

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

Upvotes: 1

Related Questions