如何连接两个表并获得正确的记录?

时间:2016-03-30 20:32:26

标签: sql sql-server join left-join

我正在进行项目,我必须将来自两个不同表的记录组合在一起,并根据参数在屏幕上显示它们。我的第一个表包含时隙记录。这是我的SLOT_TABLE的例子:

ID  Event_ID       Time_Slots
 1    150       7:00 AM - 7:15 AM
 2    150       7:15 AM - 7:30 AM
 3    150       7:30 AM - 7:45 AM
 4    150       7:45 AM - 8:00 AM
 5    150       8:00 AM - 8:15 AM
 6    150       8:15 AM - 8:30 AM

我的第二个表包含每个用户的记录。以下是我的REGISTRATION_TABLE示例:

ID   Event_ID   Supervisor_ID  Slot_ID  User_ID  Staff_ID
61     150           200         6        15       133
78     150           200         6        162      79

我有一个问题是显示我的所有时间段,但是第二个表中的记录仅针对特定用户。以下是我希望如何显示记录的示例:

ID  Event_ID       Time_Slots         User_ID
 1    150       7:00 AM - 7:15 AM
 2    150       7:15 AM - 7:30 AM
 3    150       7:30 AM - 7:45 AM
 4    150       7:45 AM - 8:00 AM
 5    150       8:00 AM - 8:15 AM
 6    150       8:15 AM - 8:30 AM      162

正如您所看到的,我想显示我的时间段和显示记录,仅针对ID为162的用户,而不是同时显示id为15的用户。我尝试使用此查询来获取:

Select s.Time_Slots, r.User_ID  
From SLOT_TABLE s
Left Outer Join REGISTRATION_TABLE r
On s.ID = r.SLOT_ID
Where s.EVENT_ID = '150'

但上面的查询给了我这个:

ID  Event_ID       Time_Slots          User_ID
 1    150       7:00 AM - 7:15 AM
 2    150       7:15 AM - 7:30 AM
 3    150       7:30 AM - 7:45 AM
 4    150       7:45 AM - 8:00 AM
 5    150       8:00 AM - 8:15 AM
 6    150       8:00 AM - 8:15 AM        162
 6    150       8:00 AM - 8:15 AM        15

之后我试图限制我对User_ID的查询,我得到了这个:

Select s.Time_Slots, r.User_ID  
From SLOT_TABLE s
Left Outer Join REGISTRATION_TABLE r
On s.ID = r.SLOT_ID
Where s.EVENT_ID = '150'
And User_ID = '162'

 ID  Event_ID       Time_Slots                 User_ID
 6    150        8:00 AM - 8:15 AM               162

所以我的问题是如何获得所有时间段,但同时限制我对我想要的User_ID的查询?在sql中甚至可以这样吗?如果有人可以帮助解决这个问题,请告诉我。提前谢谢。

3 个答案:

答案 0 :(得分:3)

当您使用WHERE限制最终结果时,在您的情况下,您离开外部联接,然后您只选择具有用户的项目。您需要使用LEFT JOIN的ON子句来选择性地加入,同时保留第一个表中的原始记录。

也许是这样的:

Select s.Time_Slots, r.User_ID  
From SLOT_TABLE s
Left Outer Join REGISTRATION_TABLE r
On s.ID = r.SLOT_ID
-- here, in the ON clause, not in WHERE
And User_ID = '162'
--probably you also want to check the registration table EVENT_ID?
AND s.EVENT_ID=r.EVENT_ID
Where s.EVENT_ID = '150'

答案 1 :(得分:2)

试试这个。您需要使用您所使用的用户ID编辑第8行,使用您追踪的事件ID编辑第9行。

select a.id
  ,a.event_id
  ,case when b.user_id is not null then 'User_ID(' + b.user_id + ')' else a.time_slots end as time_slots
from slot_table a
left join registration_table b
on a.event_id = b.event_id
and b.slot_id = a.id
and b.user_id = '162'     -- parameter 1
where a.event_id = '150'  -- parameter 2

编辑:以上代码适用于原始要求,以下代码为新要求:

select a.id
  ,a.event_id
  ,a.time_slots
  ,b.user_id
from slot_table a
left join registration_table b
on a.event_id = b.event_id
and b.slot_id = a.id
and b.user_id = '162'     -- parameter 1
where a.event_id = '150'  -- parameter 2

答案 2 :(得分:1)

所以基本上你就两张信息加入了表格:
1)Slot_ID
2)Event_ID

例如:您希望获得包含有关event = 150和slot time = 6的信息的行。在您获得表之间的链接之后,您将希望限制您的值,特定事件(150)和特定用户。正如cantSleepNow所说,您无法在具有时间值的列中获取该用户值。因此,您最有可能寻找格式的是:

ID | EVENT_ID | TIME_SLOTS | USER_ID

因此,您可以看到时段ID,事件ID,实际时段以及进入该事件的用户。

所以最有可能的是:

SELECT ST.ID, ST.EVENT_ID, ST.Time_Slots, RT.User_ID
FROM SLOT_TABLE AS ST
LEFT OUTER JOIN REGISTRATION_TABLE AS RT 
ON ST.ID = RT.SLOT_ID AND ST.EVENT_ID = RT.EVENT_ID
WHERE ST.EVENT_ID = '150' AND RT.User_ID = 'XXX'