左联接未返回期望的结果

时间:2020-01-23 20:09:51

标签: sql-server join left-join ssms

我有两个查询,每个查询的输出如下所示:

SELECT UserID, ActivityDate, ActivityDay, ActivityTime
FROM Activities 
WHERE ActivityType='MYS'

enter image description here

SELECT USerID, TimeFrom, TimeTo, ActivityDay
FROM [dbo].[userActivities]  WHERE UserID=123

enter image description here

预期结果:

两个查询都可以使用以下链接:

  • Activities.UserID = userActivities.UserID
  • Activities.ActivityDay = userActivities.ActivityDay

我需要从第一个数据集中获得所有4行,并且需要添加的新列基于第二个查询中的值。 ActvityDay 7有两条记录,因为在下一次查询ActvityDay 7时有两条记录

enter image description here

我试图使用LEFT JOIN提取数据,但是没有得到想要的结果。有人可以让我知道我在做什么错吗?

我正在尝试查询:

SELECT DISTINCT AD.UserID, AD.ActiityDate, AD.ActivityDay, AD.ActivityTime,
CASE WHEN AD.ActiityDate = userActivities.ActivityDay THEN 'Yes' ELSE 'No' END AS [ActivityExists],
CASE WHEN AD.ActiityDate = userActivities.ActivityDay THEN UA.TimeFrom ELSE '' END AS [Time],
FROM Activities AD LEFT JOIN userActivities UA ON AD.UserID=UA.UserID 
AND AD.ActiityDate = userActivities.ActivityDay

1 个答案:

答案 0 :(得分:0)

您的联接和CASE表达式基于错误的列。
另外,由于您为表使用别名,因此请使用别名,并且不要混用表名和别名。
试试这个:

SELECT DISTINCT 
  AD.UserID, AD.ActivityDate, AD.ActivityDay, AD.ActivityTime,
  CASE WHEN AD.ActivityDay = UA.ActivityDay THEN 'Yes' ELSE 'No' END AS [ActivityExists],
  CASE WHEN AD.ActivityDay = UA.ActivityDay THEN UA.TimeFrom ELSE '' END AS [Time]
FROM Activities AD LEFT JOIN userActivities UA 
ON AD.UserID=UA.UserID  AND AD.ActivityDay = UA.ActivityDay

请参见demo
结果:

> UserID | ActivityDate | ActivityDay | ActivityTime | ActivityExists | Time    
> -----: | :----------- | ----------: | :----------- | :------------- | :-------
>    123 | 2020-01-20   |           1 | 2:20 PM      | No             |         
>    123 | 2020-01-23   |           4 | 2:54 PM      | No             |         
>    123 | 2020-01-24   |           5 | 3:06 PM      | Yes            | 9:10 AM 
>    123 | 2020-01-28   |           7 | 11:00 AM     | Yes            | 11:15 AM
>    123 | 2020-01-28   |           7 | 11:00 AM     | Yes            | 12:05 PM