【问题标题】:Using Outer Apply To return null values使用外部应用返回空值
【发布时间】:2011-07-18 02:04:59
【问题描述】:

我有以下表格:

具有主键和用户名的用户,例如

ID 用户名
1 弗雷德
2约翰
3 杰克

具有主键和事件名称的事件

ID 事件名称
1 法拉利路演
2 花展

具有主键、状态更新和用户 ID(外键)的 UserStatusUpdates 表

ID 用户ID 用户状态
1 1 真的很好
2 1 现在离开
3 2 我同意

还有一个 Event Attendee 表,它有一个主键和两个外键(Event 主键和 User 主键)

ID 用户ID 事件ID
1 1 1
2 2 1
3 3 1

我遇到的问题是我需要返回所有活动参与者以及他们最新的状态更新,但是有些情况下用户实际上并没有进行状态更新。

这是我的查询的样子:

SELECT EventAttendee.*, Users.UserName,Users.USERS_ID, 
Users.ThumbnailPic,
Users.CountryName,
ISNULL(UserStatusUpdates.UserStatus,'No Updates')AS LastUpdate,
UserStatusUpdates.MediaTypeID,UserStatusUpdates.USERSTATUS_ID,(UserStatusUpdates.AddDate)

FROM EventAttendee
JOIN Users ON Events.UserID = Users.USERS_ID
OUTER APPLY  (SELECT TOP 1 UserStatusUpdates.UserStatus,UserStatusUpdates.MediaTypeID,
UserStatusUpdates.USERSTATUS_ID,UserStatusUpdates.AddDate, UserStatusUpdates.UserID
  FROM UserStatusUpdates  where UserStatusUpdates.UserID = Users.USERS_ID
ORDER BY AddDate DESC) AS UserStatusUpdates WHERE UserStatusUpdates.UserID = EventAttendee.UserID

WHERE EventAttendee.EventID = @EventID 
AND Users.bDeleted = 'False' 
AND Users.bSuspended =  'False'
END 

如何找回未更新的用户?

【问题讨论】:

  • 我不明白背靠背在哪里 - WHERE TempUserStatusUpdates.UserID = EventAttendee.UserID WHERE EventAttendee.EventID = @EventID
  • 对不起,这是一个错误,我已将其改回 UserStatusUpdates。

标签: sql tsql


【解决方案1】:

您的查询有多个 where 子句,并且您已经在子查询中指定了 UserStatusUpdates.UserID = Users.USERS_ID 连接。试试这个:

SELECT 
  EventAttendee.*, 
  Users.UserName,Users.USERS_ID, 
  Users.ThumbnailPic,
  Users.CountryName,
  ISNULL(UserStatusUpdates.UserStatus,'No Updates') AS LastUpdate,
  UserStatusUpdates.MediaTypeID,
  UserStatusUpdates.USERSTATUS_ID,
  UserStatusUpdates.AddDate
FROM 
  EventAttendee
  JOIN Users ON 
    Events.UserID = Users.USERS_ID
  OUTER APPLY (
    SELECT TOP 1 
      UserStatusUpdates.UserStatus,
      UserStatusUpdates.MediaTypeID,
      UserStatusUpdates.USERSTATUS_ID,
      UserStatusUpdates.AddDate,
      UserStatusUpdates.UserID
    FROM 
      UserStatusUpdates  
    WHERE 
      UserStatusUpdates.UserID = Users.USERS_ID
    ORDER BY 
      AddDate DESC
  ) AS UserStatusUpdates 
WHERE 
  EventAttendee.EventID = @EventID 
  AND Users.bDeleted = 'False' 
  AND Users.bSuspended =  'False'
END 

【讨论】:

  • 哇,非常感谢,我一直在努力解决这个问题。再次非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2019-05-22
相关资源
最近更新 更多