2

プロジェクトでは、ユーザーはイベント用の部屋を予約できます。1 つのイベントで、多くの予約 (tblEventTimePeriod) と多くの部屋 (tblEventTimePeriodRoom) を持つことができます。私はこのような DB 構造を持っています。例を単純化するために、不要な列を削除しました。

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 - Event が RoomId = X を予約したことを意味します。どの tblEventTimePeriod がこの予約を持っているかは問題ではありません。

実際の解決策は、スカラー UDF (ユーザー定義関数) を使用してこの情報を取得することです。最初は大丈夫でしたが、今では実行時間が許容できません。実際には、行(tblEvent)ごとに、tblEventTimePeriod に結合された tblEventTimePeriodRoom にサブクエリを実行して、行の存在を確認します。レポートに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

よろしくお願いします!

4

1 に答える 1