在項目中,用戶可以預定活動的房間。在一個事件中,我們可以有許多保留(tblEventTimePeriod)與許多房間(tblEventTimePeriodRoom) 我有這樣的數據庫結構。我去掉不必要的列,以簡化的例子中,表之間快速查詢最終用戶報告
tblEvent (ID, Name)
tblEventTimePeriod (ID, EventId)
tblEventTimePeriodRoom (ID, EventTimePeriodId, RoomId)
關係:
tblEvent to tblEventTimePeriod -> One to many
tblEventTimePeriod to tblEventTimePeriodRoom -> many to many
對於這個例子,RoomId可以採取從1值5.在它有40個不同的值實際項目(鍵在其他表格中),我必須在報告中顯示爲列。
我的問題是 - 如何建立快速查詢,如下得到的結果是:
EventId | EventName | RoomId_1 | RoomId_2 | RoomId_3 | RoomId_4 | RoomId_5
RoomId_X - meens比事件已預留RoomId = X.它沒有哪個tblEventTimePeriod有這個預訂事宜。
實際的解決方案是使用標量UDF(用戶定義函數)來獲取此信息。一開始沒事,但現在執行時間不可接受。實際上,對於每一行(tblEvent)它執行的子查詢將tblEventTimePeriodRoom加入到tblEventTimePeriod中以檢查行是否存在。當報告有40列....沒有評論:)
我會感激任何提示!我正在使用SQL Server 2008 R2。
示例數據:
tblEvent:
----------
Id | Name
----------
1 | Event1
2 | Event2
3 | Event3
tblEventTimePeriod:
------------
Id | EventId
------------
12 | 1
13 | 2
14 | 2
15 | 3
tblEventTimePeriodRoom
-------------------------------
Id | EventTimePeriodId | RoomId
-------------------------------
110 | 15 | 1
111 | 15 | 5
112 | 13 | 5
113 | 14 | 2
114 | 14 | 3
115 | 14 | 4
116 | 14 | 5
117 | 12 | 1
Result shoud be:
--------------------------------------------------------------------------
EventId | EventName | RoomId_1 | RoomId_2 | RoomId_3 | RoomId_4 | RoomId_5
--------------------------------------------------------------------------
1 | Event1 | 1 | 0 | 0 | 0 | 0
2 | Event2 | 0 | 1 | 1 | 1 | 1
3 | Event3 | 0 | 0 | 0 | 0 | 1
最好的問候!
你能做到在應用程序代碼,而不是在SQL變換? –
您是否試過通過將每個事件加入所有房間來選擇數據,如果房間已預訂或設置了指示符,然後使用PIVOT功能? http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx – liebs19
@JoeFrambach報告機制正在使用視圖/表值函數來加載數據,所以我嘗試更改實際視圖。如果我沒有找到有趣的解決方案,我將從視圖(或視圖,如果需要)加載初始數據,並按照您的說法進行轉換。謝謝。 – robertw