2016-03-30 1 views
2

Я работаю над проектом, где мне нужно объединить записи из двух разных таблиц и отобразить их на экране на основе параметров. Моя первая таблица содержит записи временных интервалов. Вот пример моего 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 

Как вы можете видеть, что я хотел бы, чтобы отобразить мои временные интервалы и отображения записи только для моего пользователя с идентификатором 162, но не пользователь ид 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

вы получаете какие-то странные результаты обратно на основе запросов, которые вы используете – JamieD77

+0

текстовый формат вопрос откусил (выходы запроса). Вряд ли вы получите такие значения, как «User_ID (162)» и «7:00 AM - 7:15 AM» в том же столбце при запуске select. Не могли бы вы исправить это? – cantSleepNow

+0

Почему вы показываете 'user (162)', но не 'user (15)'? Какова логика? –

ответ

2

Попробуйте это. Вам нужно отредактировать строку 8 с идентификатором пользователя, которым вы являетесь, и с линией 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 

Edit: приведенный выше код будет работать для первоначального требования, приведенный ниже код для нового требования:

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 
+0

Я пробовал оба и работает! Большое спасибо, я пробовал так много вещей и даже не думал об использовании Case in Select. Также я отсутствовал user_id после левого соединения. Спасибо еще раз. –

3

Когда вы используете WHERE, вы ограничиваете конечный результат, в вашем случае вы оставите внешнее соединение, а затем вы выбираете только элементы с пользователем. Для выборочного соединения вам нужно использовать предложение ON для LEFT JOIN, сохраняя исходные записи из первой таблицы.

Может быть, как это:

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' 
+0

Можете ли вы представить какой-либо пример для этого? –

+0

Вот скрипка postgres, потому что sqlServer дает мне ошибку. Но то же самое http://sqlfiddle.com/#!15/6c40b/8 –

1

Так в основном вы присоединяетесь таблицы на две части информации:
1) Slot_ID
2) Event_ID

Например: вы хотите получить строки, содержащие информацию о событии = 150 и времени слота = 6. После того, как вы получите ссылку между e так, как вам захочется ограничить свои значения, полученные вами по конкретному событию (150) и конкретному пользователю. Как сказал cantSleepNow, вы не можете получить это значение пользователя в столбце, где у вас есть значения времени. Так что вы, скорее всего, ищете для форматирования заключается в следующем:

ID | EVENT_ID | TIME_SLOTS | USER_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' 
Смежные вопросы