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

Sql 如何连接两个表并获得正确的记录?,sql,sql-server,join,left-join,Sql,Sql Server,Join,Left Join,我正在进行一个项目,在这个项目中,我必须合并来自两个不同表的记录,并根据参数将它们显示在屏幕上。我的第一个表包含时隙记录。下面是我的插槽表的示例: 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

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

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
我的第二个表包含每个用户的记录。以下是我的注册表示例:

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
因此,在那之后,我试图限制对用户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

所以我的问题是,我如何在获得所有时间段的同时限制对我想要的用户ID的查询?在sql中这样的事情可能吗?如果有人能帮我解决这个问题,请告诉我。提前感谢。

当您使用WHERE限制最终结果时,在您的情况下,您离开了outer join,然后您只选择带有user的项目。您需要使用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'

试试这个。您需要编辑第8行和第9行的用户ID

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

因此,基本上您是根据两条信息连接表:
1) 插槽ID
2) 事件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'

你能提供一些例子吗?这里有一个关于postgres的问题,因为sqlServer给了我一个错误。但同样的,根据您使用的查询,您会得到一些奇怪的结果。问题文本格式有点不正确(查询输出)。运行select时,几乎不可能在同一列中获得像
User\u ID(162)
7:00 AM-7:15 AM
这样的值。您能解决这个问题吗?为什么显示
user(162)
,而不显示
user(15)
?逻辑是什么?它们在不同的屏幕上,这就是为什么我必须把它们分开。我两个都试过了,效果都很好!非常感谢,我尝试了很多东西,甚至没有考虑在Select中使用Case。另外,我在离开加入后丢失了用户id。再一次谢谢你。