2016-03-30 43 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的ID,以顯示我的時隙和顯示記錄只爲我的用戶,而不是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

你得到一些奇怪的結果返回根據您使用 – JamieD77

+0

查詢的問題的文本格式是有點過(查詢輸出)。當您運行select時,很難在同一列中獲得像'User_ID(162)'和'7:00 AM - 7:15 AM'這樣的值。你能解決這個問題嗎? – 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 

編輯:上面的代碼將在原有工作的要求,新要求,下面的代碼:

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

我嘗試了兩個工程!非常感謝,我嘗試了很多東西,甚至沒有考慮在Select中使用Case。在離開加入之後,我還缺少了user_id。再次感謝您。 –

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

你能提供任何例子嗎? –

+0

這是一個關於postgres的小提琴,因爲sqlServer給我一個錯誤。但是是相同的http://sqlfiddle.com/#!15/6c40b/8 –

1

所以基本上你的兩條信息連接表:
1)Slot_ID
2)Event_ID

例如:您想要獲取有關event = 150和slot time = 6的信息的行。獲取第e表格,這樣您就可以限制特定事件(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' 
相關問題