我正在进行项目,我必须将来自两个不同表的记录组合在一起,并根据参数在屏幕上显示它们。我的第一个表包含时隙记录。这是我的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中甚至可以这样吗?如果有人可以帮助解决这个问题,请告诉我。提前谢谢。
答案 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'